3

我们有以下情况:

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。

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

4

1 回答 1

-1

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

于 2012-04-17T14:36:23.940 回答