当前位置: 首页 > 知识库问答 >
问题:

每个请求的Java新会话?

拓拔嘉运
2023-03-14

我一直有一个问题,当请求来自域名而不是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值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它们?

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

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

使现代化

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

共有2个答案

公冶高义
2023-03-14

问题在于JSESSIONID cookie中的路径。我仍然不明白为什么会将其设置为tomcat应用程序路径/tomcat应用程序名称/但我更改了web中的cookie配置。xml收件人:

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

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

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

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

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

安泰平
2023-03-14

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

在这里阅读javadoc

您可以像响应一样使用它。sendRedirect(response.encodeRedirectURL(path))

 类似资料:
  • 问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话

  • 我有一个遗留的Java1.6运行localhostTomcat 7应用程序使用JSP页面,一个带有框架的框架集,javascript,但没有像Struts这样的框架。我使用请求或会话从servlet传递一个对象以在页面中显示,这很好。 然而,我最近做了一些更改,现在我无法从会话或请求中检索到相同的对象。它以前工作得很好,所以我不确定是什么坏了,但我甚至无法将字符串值从JSP返回到servlet。

  • 我们正在尝试使用Drool作为我们的规则引擎服务。我们到目前为止所做的如下 部署的工作台7.2.final 已部署的KIE服务器7.2.0。final 配置了一些数据对象、规则,将更改部署到KIE服务器,我们可以使用rest API执行规则 无状态会话满足了我们的大部分需求(给出一组数据,执行规则并返回数据,仅此而已)。但是使用无状态时,我们必须牺牲Drools有状态会话提供的许多重要特性。 我们

  • 问题内容: 我刚刚启动了一个简单的Java测试项目,该项目使用Hibernate管理某些实体,并提供REST接口来操纵这些对象并提供一些其他业务逻辑。REST接口是使用RESTEasy和Jetty创建的。 到目前为止,一切工作正常,但是我感觉我实际上写了太多样板代码。由于我在这些Java框架中没有太多经验,所以我只是想知道是否有人可以给我提示如何改善这种情况。 每个请求创建hibernate会话

  • 问题内容: 我遇到的情况是可以从多个不同的域访问应用程序。例如, foo.com 和 bar.com 在理论上都可以指向我的应用程序。此外,它们的子域也可以指向我的应用程序,例如 red.foo.com 和 blue.foo.com 。我正在使用Express cookie会话,该会话的初始化代码如下所示: 当用户访问 foo.com 或其任何子域时,这种方法效果很好,但是 bar.com 无法正

  • 问题内容: 因此,我四处阅读,对于拥有CSRF令牌感到非常困惑,但是我应该为每个请求还是每小时生成一个新令牌? 但是,我们最好每小时生成一个令牌,然后我需要两个会话:令牌,到期, 我将如何处理该表格?只需将echo $ _SESSION [‘token’]放在隐藏值表单上,然后在提交时进行比较? 问题答案: 如果您按照表单请求进行操作-那么基本上就可以消除CSRF攻击的发生,并且可以解决另一个常见