JSESSIONID 出现在 URL 后,我的 Web 应用程序停止工作

My web application stop working after JSESSIONID appear in URL

我在 Apache Tomcat 7 中有一个 Web 应用程序 运行 并使用 Struts2。 我的登录系统是通过在会话中放置一个用户对象来创建的:

(绕过 "if" 和 "try" 以明确..)

UserService es = new UserService();
User user = es.login(username, password);
ActionContext.getContext().getSession().put("loggedUser", user);

然后,我尝试在拦截器中从该会话中获取用户对象。如果正常,则有人登录。如果没有,通过返回 "notLogged" 进入登录页面,这将被 Struts2 global-results in struts.xml 捕获:

public String intercept(ActionInvocation invocation) {
    User loggedUser = (User)invocation.getInvocationContext().getSession().get("loggedUser");
    if (loggedUser == null) {
        return "notLogged";
    }
    try {
        return invocation.invoke();
    } catch ( Exception ignored ) {
        return "notLogged";
    }
}

struts.xml

<global-results>
    <result name="notLogged">/index.jsp</result> 
</global-results>

一切都很好,直到服务器管理员进行一些维护并且 "jsessionid" 开始出现在 URL 中。在此之后,我无法再导航我的系统(直到我将此 ID 复制并粘贴到我想去的每个 URL 中。无法形成操作目的地)。我仍然可以登录,我看到用户对象仍然在捕获,但是没有这个 ID 我不能去任何目的地。

我试过这个:https://fralef.me/tomcat-disable-jsessionid-in-url.html,然后将 COOKIE 放在我的 web.xml 的 tracking-mode 标签中,但事情变得更糟了,因为现在我什至不能做登录。

发生了什么事,我该怎么做才能解决这个问题并让我的系统恢复工作?

这显然是由 cookie 路径不匹配引起的。

如果请求 URL 路径与 cookie 路径匹配,浏览器将仅发回 cookie,例如

 cookie path :  /abc
request path:   /abc/xyz   // match
request path:   /xyz       // no match

默认情况下,Tomcat将会话cookie路径设置为网络应用路径,这样cookie就不会被发送到其他网络应用。但是,在您的情况下,中间件更改了请求 URL 路径,因此浏览器观察到不同的路径,导致 cookie 路径不匹配。

在大多数情况下,我建议将 cookie 路径设置为“/”,以便它匹配对服务器的所有请求(假设 Tomcat 上只有一个应用程序)

// context.xml
<Context sessionCookiePath="/">