Получение текущего объекта сеанса в Java - PullRequest
10 голосов
/ 30 июля 2010

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

Я знаю, что в 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
       }

}

Ответы [ 5 ]

6 голосов
/ 30 июля 2010

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

6 голосов
/ 30 июля 2010

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

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

1 голос
/ 30 июля 2010

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

FacesContext.getCurrentInstance();

Поскольку это извлеченный экземпляр-одиночка, вы можете получить к нему доступ в любом месте своей презентации.layer.

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

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

1 голос
/ 30 июля 2010

Передача объекта запроса является решением

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
       }

}
0 голосов
/ 28 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...