request.getSession не возвращает тот же сеанс - PullRequest
3 голосов
/ 20 мая 2011

Наш продукт разработан весной 3.0 MVC.

Мы использовали сессию следующим образом в контроллерах.

  @Controller
  public class LoginController{
     HttpSession session;

     @RequestMapping(value="/index.htm",method = RequestMethod.POST)
     public ModelAndView viewIndex(HttpServletRequest request){
     session=request.getSession(false);
     System.out.println(request.getSession(false));
     System.out.println(session);   
     }
  }

Здесь, в Firefox, я вижу, как request.getSession(false) и session печатаются с одинаковым значением.

В IE я вижу, как request.getSession(false) печатает значение, а session печатается как null.

В чем может быть причина?

Примечание: я не использую фильтр для сессии

1 Ответ

10 голосов
/ 20 мая 2011

Вы должны никогда назначать переменные, относящиеся к запросу или сеансу, как поле класса, в котором существует только один экземпляр на протяжении всего времени жизни приложения. Все посетители веб-страницы затем будут использовать одну и ту же переменную. Посетитель X затем делится сеансом с посетителем Y. Это огромная утечка целостности данных.

Что касается захвата сеанса, если вам нужен сеанс, просто используйте request.getSession() прямо без логического значения. не присваивайте его какому-либо полю для «последующего повторного использования».

@RequestMapping(value="/index.htm",method = RequestMethod.POST)
public ModelAndView viewIndex(HttpServletRequest request){
    HttpSession session = request.getSession();
    // ... Get/set attributes?
}

Для получения дополнительной информации о том, как сервлеты работают под прикрытием (Spring MVC - это фреймворк, основанный на базовом API сервлетов), вы можете найти этот пост полезным: Как работают сервлеты? Создание экземпляров, сеансы, общие переменные и многопоточность .

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