2013-06-10 4 views
2

Требование JSESSIONID должно быть разным до и после входа в систему.JSESSIONID автоматически воссоздается после успешного входа в систему

Течение login.jsp -> loginwebaction -> loginsuccess.jsp -> Фильтр -> otheraction

мой код

  1. после успешного входа в систему (в loginwebaction)
  2. копия все атрибуты на карту от сессии
  3. сессии недействительных,
  4. воссоздать сеанс HttpSession session = request.getSession(true);
  5. скопируйте все атрибуты с карты на новую сессию,

Изменения Jsessionid после успешного входа в систему и входа loginsuccess.jsp. но у меня есть проблемы.

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

HttpSession session = request.getSession(); 
if(null == session.getAttribute("USER_INFO")){ 
    //redirect to error page 
} 

Проблема: сеанс, доступный в фильтре, является новым, не имеет представления о том, как он воссоздан. код в фильтре

Может ли кто-нибудь помочь мне в этом, как продолжить работу по исправлению этой смены сеанса?

+0

Когда отображается loginsuccess.jsp, заголовок ответа HTTP-браузера включает новый или старый JSessionid? Чтобы это увидеть, вам может потребоваться трассировка http-сообщений или использование отладки браузера для просмотра файлов cookie/страниц. Может быть, вам нужно вручную установить новый заголовок JSessionid в ответе? –

+0

Невозможно воспроизвести ошибку, добровольно отправить исходный код и детали конфигурации. –

+0

Вы проверили, есть ли у Клиента более одного сеанса Coockie - да, что может случиться в некоторых случаях. Вы также можете использовать [Фильтр дампа запроса] (http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Request_Dumper_Filter), чтобы просмотреть запрос и ответ, обмен которыми осуществляется между клиентом и сервером. Другим способом может быть использование [HttpSessionListener] (http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionListener.html) для регистрации при создании/уничтожении сеанса – andih

ответ

1

Как я вижу, что проблема в вашем коде:

HttpSession session = request.getSession(); 

От Servlet API, request.getSession() создает новую сессию, если нет существующего сеанса. Вы должны изменить его на:

HttpSession session = request.getSession(false); 

Это позволит убедиться, что она возвращает существующий объект сеанса (если допустим) или возвращает нулевое значение, если нет сессии.

Чтобы добавить немного больше, следующие строки коды эффективно идентичны:

HttpSession session = request.getSession(); 
//Overloaded getSession with 'true' boolean argument 
HttpSession session = request.getSession(true); 

Надеется, что это помогает.

Если это не исправить вашу проблему, проблема может быть чем-то еще. Пожалуйста, добавьте код скелета вашего usecase, чтобы я мог попробовать.

+0

Я думаю, что это не поможет. Как писал Гири, сеанс, увиденный фильтром, является новым. Ваше предложение будет возвращать только «null», если фильтр является тем, который создает новый сеанс, но на этом этапе должен существовать существующий сеанс. – andih

Смежные вопросы