【问题标题】:Ignore cookies for specific URIs in Tomcat忽略 Tomcat 中特定 URI 的 cookie
【发布时间】:2012-04-28 21:12:56
【问题描述】:

我们有以下情况:

JSESSIONID 是通过 cookie 和 URL 发送的,但是由于 Adob​​e Flash BUG,它们是不同的(实际上,cookie JSESSIONID 是错误的)。

我们想要做的是使用 URL JSESSIONID 而不是在 cookie 中发送的那个。换句话说,当我执行 request.getSession() 时,它应该返回与 URL 中的 ID 关联的 HttpSession,而不是在 cookie 中。

我们查看了 Tomcat7 源代码,事实上,Tomcat 首先解析 URL,搜索标识符。然后,如果它们存在,它会用 cookie SESSIONID 覆盖它。这是 CoyoteAdapter.java (tomcat 7.0.26) 中的代码:

        String sessionID = null;
        if (request.getServletContext().getEffectiveSessionTrackingModes()
                .contains(SessionTrackingMode.URL)) {

            // Get the session ID if there was one
            sessionID = request.getPathParameter(
                    SessionConfig.getSessionUriParamName(
                            request.getContext()));
            if (sessionID != null) {
                request.setRequestedSessionId(sessionID);
                request.setRequestedSessionURL(true);
            }
        }

        // Look for session ID in cookies and SSL session
        parseSessionCookiesId(req, request);
        parseSessionSslId(request);

我们可以完全禁用 cookie JSESSIONID,但我们不能,因为我们将它用于网站中的所有 URL。我们想为这个特定的 URL 禁用 cookie。

有可能吗?有没有其他想法或解决方法来解决这个问题?

【问题讨论】:

    标签: java tomcat servlets cookies jsessionid


    【解决方案1】:

    您可以实现自定义servlet filter,用您自己的包装器替换请求、响应和会话对象。然后,包装器可以根据 URL 表现不同,例如委托或不委托给原始会话实例。尽管您将无法访问其他 id 的会话数据,但不更改 Tomcat 代码。

    【讨论】:

    • 这个不行,因为在执行Filter的时候,session对象已经建好了(也就是说我们进入Filter之前就使用了cookies jsessionid)
    • 你测试了吗?我很确定在第一次 getSession() 调用之前不会创建/恢复会话实例。
    • 是的。我们确实对其进行了测试:-) - 我们也尝试使用 Valves,但我们遇到了同样的问题。确实在第一次getSession()调用之前没有创建session,但是sessionId已经关联到请求了(如上代码所示)
    猜你喜欢
    • 2012-02-26
    • 2017-10-31
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多