Будет ли tomcat возвращать сеанс в случае существования нескольких файлов cookie с именем JSessionIDs

#java #jsp #session #servlets

#java #jsp #сеанс #сервлеты

Вопрос:

Рассмотрим ситуацию, когда сервер tomcat получает несколько файлов cookie с именем JSessionID, из которых один JSessionID является действительным, поэтому tomcat все равно вернет сеанс или нет? Если tomcat считывает только первый JSessionID и сопоставляет с сохраненными сеансами, он может не найти допустимый sesison и может сохранить null. Но если tomcat считывает все файлы cookie с именем JSessionID и проверяет наличие сеанса для каждого JSessionID, он вернет действительный сеанс. Иногда мы наблюдали, что браузер отправляет два файла cookie с одинаковым именем, один из которых является недавним сеансом аутентификации, а другой — какой-то старый файл cookie с устаревшим значением. Отсюда запрос, чтобы узнать, как ведет себя tomcat?

Ответ №1:

Из кода в исходном коде tomcat файл cookie jsessionid переопределит jsessionid в запросе (при условии, что контекст позволяет использовать cookie для отслеживания сеанса).

Если присутствует несколько файлов cookie jsessionid, будет взят первый, представляющий действительный сеанс (для рассматриваемого контекста).

смотрите класс Tomcat 7.0.x CoyoteAdapter :

 /**
 * Parse session id in URL.
 */
protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) {

    // If session tracking via cookies has been disabled for the current
    // context, don't go looking for a session ID in a cookie as a cookie
    // from a parent context with a session ID may be present which would
    // overwrite the valid session ID encoded in the URL
    Context context = (Context) request.getMappingData().context;
    if (context != null amp;amp; !context.getServletContext()
            .getEffectiveSessionTrackingModes().contains(
                    SessionTrackingMode.COOKIE)) {
        return;
    }

    // Parse session id from cookies
    Cookies serverCookies = req.getCookies();
    int count = serverCookies.getCookieCount();
    if (count <= 0) {
        return;
    }

    String sessionCookieName = SessionConfig.getSessionCookieName(context);

    for (int i = 0; i < count; i  ) {
        ServerCookie scookie = serverCookies.getCookie(i);
        if (scookie.getName().equals(sessionCookieName)) {
            // Override anything requested in the URL
            if (!request.isRequestedSessionIdFromCookie()) {
                // Accept only the first session id cookie
                convertMB(scookie.getValue());
                request.setRequestedSessionId
                    (scookie.getValue().toString());
                request.setRequestedSessionCookie(true);
                request.setRequestedSessionURL(false);
                if (log.isDebugEnabled()) {
                    log.debug(" Requested cookie session id is "  
                        request.getRequestedSessionId());
                }
            } else {
                if (!request.isRequestedSessionIdValid()) {
                    // Replace the session id until one is valid
                    convertMB(scookie.getValue());
                    request.setRequestedSessionId
                        (scookie.getValue().toString());
                }
            }
        }
    }

}