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

时间:2015-10-20 22:08:30

标签: java configuration struts2 tomcat7 session-cookies

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

(绕过"如果""尝试"要明确......)

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

然后,我尝试在Interceptor中从该会话中获取User对象。如果没问题,那么有人会被记录。如果没有,请返回" notLogged"进入登录页面。这将由struts2全局结果 - 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>

一切都很顺利,直到服务器管理员做了一些维护和&#34; jsessionid&#34;开始出现在URL中。在此之后,我无法再导航我的系统(直到我将此ID复制并粘贴到我想要去的每个URL中。无法形成操作目标)。我仍然能够登录,并且我看到User对象仍然在捕捉,但是我无法在没有此ID的情况下前往任何目的地。

我尝试了这个:https://fralef.me/tomcat-disable-jsessionid-in-url.html,并在我的web.xml中将COOKIE放在tracking-mode标记中,但事情变得更糟,因为现在我甚至无法登录。

发生了什么事,我该怎么办才能解决这个问题并让我的系统重新投入使用?

1 个答案:

答案 0 :(得分:2)

这显然是由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路径设置为&#34; /&#34;,以便它匹配对服务器的所有请求(假设Tomcat上只有一个应用程序)

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