每个请求的Java新会话?

时间:2013-09-28 14:00:19

标签: java servlets

当请求来自域名而不是localhost时,我遇到了会话变量无法使用的问题。例如,如果我设置了一个用户变量:

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管理器查看应用程序时,无论我在同一浏览器窗口中使用该应用程序,会话数量都会继续增长,没有刷新页面或任何东西。是否在每次向服务器发出请求时都会创建新会话?

仅当从域名ex:example.com/app访问应用程序时才会发生这种情况。来自localhost时,会话变量可以正常工作。

更新

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

2 个答案:

答案 0 :(得分:0)

你是如何进行重定向的?你是在预先调用HttpServletResponse.encodeRedirectURL()吗?

阅读the javadoc here

您可以像response.sendRedirect(response.encodeRedirectURL(path));

一样使用它

答案 1 :(得分: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>

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