我有一个在Apache Tomcat 7中运行并使用Struts2的Web应用程序。我的登录系统是通过将一个User对象放在一个会话中而制成的:
(为了清楚起见,请绕过“ if”和“ try”。)
UserService es = new UserService();
User user = es.login(username, password);
ActionContext.getContext().getSession().put("loggedUser", user);
然后,我尝试从Interceptor的该会话中获取User对象。如果一切正常,则将有人登录。如果不是,请返回Struts.xml中的Struts2全局结果捕获的“ notLog”来进入登录页面:
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
在tracking-mode
标签在web.xml中我,但事情去最坏的,因为现在我做不到,甚至登录。
发生了什么,我该怎么做才能解决此问题并使系统恢复正常工作?
这显然是由Cookie路径不匹配引起的。
浏览器仅在请求URL路径与cookie路径匹配时发送回cookie,例如
cookie path : /abc
request path: /abc/xyz // match
request path: /xyz // no match
缺省情况下,Tomcat将会话cookie路径设置为Web应用程序路径,这样就不会将cookie发送到其他Web应用程序。但是,在您的情况下,中间件会更改请求URL路径,因此浏览器会观察到其他路径,从而导致Cookie路径不匹配。
在大多数情况下,我建议将cookie路径设置为“ /”,以使其与服务器上的所有请求相匹配(假设Tomcat上只有一个应用程序)
// context.xml
<Context sessionCookiePath="/">
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句