Получение текущего объекта сеанса в Java

Могу ли я получить доступ к объекту сеанса из функции, в которой отсутствует объект запроса?

Я знаю, что в Java мы получаем доступ к сеансу следующим образом:

HttpSession session = request.getSession(true);

Но что, если мы хотим получить доступ к сеансу, когда объект запроса отсутствует?

Возможно ли это? есть альтернативный способ получить объект сеанса?

Изменить

У меня есть сервлет

public class ABC extends HttpServlet
{
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
    {
             ..........
             ...........
        myFun1(x,y,z);  
    }

      private void myFun1(int x, int y,long z)
      {
            .........
            myFun2(a,b);    
       }

      private void myFun2(int a,String b)
      {
            .........

            //      Need Session here
       }

}

Ответ 1

Это зависит от того, что вы подразумеваете под "когда объект запроса отсутствует". У вас может быть локальная переменная потока, которая устанавливает "текущий запрос для этого потока" на раннем этапе сервлета или что бы вы ни запутили (вы не дали понять). Затем вы можете получить "текущий запрос в этом потоке" из любого места и получить сеанс таким образом. (Или в тех же строках, вы можете установить текущий сеанс вместо текущего запроса в локальной переменной потока.)

Это не очень красиво, хотя, и у вас проблемы, если вы хотите что-то сделать в другом потоке. Передача запроса или сеанса вниз как зависимость обычно более чистая.

Ответ 2

В общем говоря, если вы хотите получить доступ к сеансу http из места, где объект запроса недоступен, у вас могут возникнуть проблемы с дизайном в вашем приложении, и вам нужно переосмыслить проблемы, расслоение и т.д.

Ответ 3

передающий объект запроса является решением,

public class ABC extends HttpServlet
{
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
    {
             ..........
             ...........
        myFun1(x,y,z,req);  
    }

      private void myFun1(int x, int y,long z,HttpServletRequest req)
      {
            .........
            myFun2(a,b,req);    
       }

      private void myFun2(int a,String b,HttpServletRequest req)
      {
            .........

            //      Need Session here
       }

}

Ответ 4

Если вы реализуете технологию JSF в своем приложении, вы можете получить доступ ко всем, позвонив:

FacesContext.getCurrentInstance();

Поскольку это экземпляр singleton, вы можете получить доступ к нему в любом месте вашего уровня представления.

Однако реализация JSF, вероятно, немного переполнена именно для этой цели, так как вам, вероятно, придется внести много изменений в свои уровни конфигурации и представления, чтобы их можно было разместить.

Тем не менее, если вы решите пойти по этой дороге, вы также можете подумать об использовании MyFaces, что является фантастическим API для тех, кто использует JSF в своих приложениях.

Ответ 5

Мы должны настроить один прослушиватель типа HttpSessionListener, его метод будет вызываться во время создания сеанса и времени отвлечения. Если вы нам это, подготовив объект этого класса, вы можете просто получить объект Session...