Как сбросить JSESSIONID

считается хорошей практикой безопасности сбросить cookie сеанса, когда пользователь аутентифицируется.

Как это сделать в Java?

моя попытка до сих пор успешна, но мне было интересно, есть ли лучший способ:

public static HttpSession resetSessionId(HttpSession session, 
      HttpServletRequest request) {
    session.invalidate();
    session = request.getSession(true);
    return session;
}

4 ответов


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

 Cookie cookie = new Cookie ("JSESSIONID", "randomValue");
 cookie.setMaxAge( 0 );

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


Я передаю только запрос, из которого я получаю сеанс. Если сеанс еще не существует, нет смысла создавать его только для того, чтобы сделать его недействительным. Это также выполняется, если сеанс только что был создан контейнером (из-за первого http-запроса пользователя непосредственно в форме входа).

public static ... (HttpServletRequest request) { 
    HttpSession session = request.getSession(false);
    if (session!=null && !session.isNew()) {
        session.invalidate();
    }

Tomcat (начиная с 6.0.24 AFAIK) может автоматически изменять sessionId при аутентификации - если вы используете стандартные механизмы аутентификации сервлетов (базовая аутентификация на основе форм). Это можно настроить с помощью changeSessionIdOnAuthentication для базового клапана аутентификации:http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html


другой способ(не лучший способ) - вызвать "changeSessionId (existingSession)" из org.apache.catalina.session.StandardManager который изменит идентификатор сеанса текущего сеанса на новый случайно сгенерированный идентификатор сеанса.

для вызова этого метода необходимо использовать StandardManager Mbean. Пожалуйста, смотрите Tomcat MBeans

псевдо код:

Имя объекта contextObjectName = новое имя объекта("Catalina: type=Manager, path= / whatever, host=whateverhost");

mbeanServer.invoke (contextObjectName, "changeSessionId", новый объект[]{сеанс}, новая строка[]{"javax.сервлет.http.HttpSession"});