java - 如果存在多个名为 JSessionIDs 的 cookie,tomcat 是否会返回 session

标签 java jsp session servlets

考虑这样一种情况,tomcat 服务器收到多个名为 JSessionID 的 cookie,其中一个 JSessionID 是有效的,那么 tomcat 是否仍会返回 session ?如果 tomcat 仅读取第一个 JSessionID 并与存储的 session 进行映射,那么它可能找不到有效的 session 并且可能存储 null。但是,如果 tomcat 读取所有名为 JSessionID 的 cookie 并检查每个 JSessionID 是否存在 session ,那么它将返回有效的 session 。有时我们观察到浏览器发送两个具有相同名称的 cookie,一个是最近的身份验证 session ,另一个是具有过时值的旧 cookie。因此要查询 tomcat 的行为如何?

最佳答案

从 tomcat 源代码中,jsessionid cookie 将覆盖查询中的 jsessionid(前提是上下文允许使用 cookie 进行 session 跟踪)。

如果存在多个 jsessionid cookie,则将采用第一个代表有效 session (对于所考虑的上下文)的cookie。

参见Tomcat 7.0.x CoyoteAdapter class :

/**
 * 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 && !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());
                }
            }
        }
    }

}

关于java - 如果存在多个名为 JSessionIDs 的 cookie,tomcat 是否会返回 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404042/

相关文章:

c# - NHibernate session 管理?

php - 如何通过 apache 清除 PHP $_SESSION?

java - 从一个 Activity 传递一个长类型变量并在另一个 Activity 中接收它并将其显示在 TextView 中

jsp - 使用 intellij IDEA 调试 JSP

java - 将按键发送到 JTextField

java - 嵌套 <嵌套 :equal> and <nested:write> in combination

java - 使用 JSP 呈现嵌套列表

asp.net - 有没有办法在发出 ASP .NET 请求时扩展类 ASP session ?

java - 在项目上单击字符串数组

java - Firebase Realtime 在类 java.lang.CharSequence 上找不到要序列化的属性