1

当请求来自域名而不是本地主机时,我一直遇到会话变量不可用的问题。例如,如果我设置一个用户变量:

request.getSession(true).setAttribute("user", user);
//Redirects to another html page or something...

当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回 null。

//Client makes another request to the server
request.getSession(true).getAttribute("user"); //returns null

我注意到在每个请求中,都会设置一个新的 JSESSIONID cookie,并且 ID 值会发生变化。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间维护相同的会话,以便我可以将对象存储在 HttpSession 中并可以访问它们?

我不知道这是否与任何事情有关,但是当从 tomcat 管理器查看应用程序时,会话数继续增长,不管我从同一个浏览器窗口使用应用程序,而不是刷新页或任何东西。对服务器的每个请求都在创建新会话的另一个迹象?

这仅在从域名访问应用程序时发生,例如:example.com/app。当来自本地主机时,会话变量工作正常。

更新

我在没有使用 response.sendRedirect 的情况下进行了测试,并且会话变量可用,直到我切换页面并向服务器发出另一个请求。这证实了我的怀疑,即每个请求都会创建一个新会话。它不是杀死会话的重定向,而是任何新请求。我该如何防止这种情况?

4

2 回答 2

0

你是怎么做重定向的?您是否事先调用 HttpServletResponse.encodeRedirectURL() ?

在此处阅读javadoc

你会像这样使用它response.sendRedirect(response.encodeRedirectURL(path));

于 2013-09-28T14:11:22.320 回答
0

问题在于 JSESSIONID cookie 中的路径。我仍然无法弄清楚为什么它被设置为 tomcat 应用程序路径 /tomcat-app-name/ 但我将 web.xml 中的 cookie 配置更改为:

<session-config>
  <cookie-config>
     <name>JSESSIONID</name>
     <path>/</path>
     <http-only>true</http-only>
     <secure>true</secure>
  </cookie-config>
</session-config>

现在会话变量正在跨会话工作。当然,现在会话变量在使用 localhost 运行时不起作用。相反,您可以在 context.xml 根上下文节点上设置 sessionCookiePath:

我正在使用 ubuntu 服务器和 tomcat7。对于 tomcat7,可以在 /etc/tomcat7/context.xml 中找到 context.xml。

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

现在,您应该能够在本地(如果您没有在本地计算机上更改该 cookiepath)以及在服务器上运行,而无需在您的应用程序 web.xml 中配置 JSESSIONID cookie。

于 2013-09-28T15:25:27.123 回答