我有一个在 Apache Tomcat 7 中运行并使用 Struts2 的 Web 应用程序。 我的登录系统是通过将 User 对象放入 session 中来实现的:
(为了清楚起见,绕过“如果”和“尝试”..)
UserService es = new UserService();
User user = es.login(username, password);
ActionContext.getContext().getSession().put("loggedUser", user);
然后,我尝试从拦截器中的 session 中获取用户对象。如果正常,则有人已登录。如果没有,则通过返回“notLogged”进入登录页面,该“notLogged”将被struts.xml中的Struts2全局结果捕获:
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 中。无法形成操作目的地)。我仍然能够登录,并且我看到 User 对象仍然在捕获,但如果没有此 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 将 session Cookie 路径设置为 Web 应用程序路径,这样 Cookie 就不会发送到其他 Web 应用程序。但是,在您的情况下,中间件更改了请求 URL 路径,因此浏览器观察到不同的路径,导致 cookie 路径不匹配。
在大多数情况下,我建议将 cookie 路径设置为“/”,以便它匹配对服务器的所有请求(假设 Tomcat 上只有一个应用程序)
// context.xml
<Context sessionCookiePath="/">
关于java - JSESSIONID 出现在 URL 中后,我的 Web 应用程序停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33247677/