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="/">
我在 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="/">