【问题标题】:New Session is created with each servlet request from JSPs?使用来自 JSP 的每个 servlet 请求创建新会话?
【发布时间】:2015-09-25 03:12:00
【问题描述】:

我有一个运行 localhost 的旧版 Java 1.6 和 Tomcat 7 应用程序,使用 JSP 页面、带有框架的框架集、javascript,但没有像 Struts 这样的框架。我使用请求或会话从 servlet 传递一个对象以显示在页面中,并且效果很好。

但是,我最近做了一些更改,现在我无法从会话或请求中检索相同的对象。它以前一直工作正常,所以我不确定是什么坏了,但我什至不能将字符串值从 JSP 发送回 servlet。

我创建了一个新的精简 JSP,但无论使用请求还是会话,我都无法从中获得任何回报。当我将代码推送到我们的 Tomcat 6 Web 服务器时,它也会做同样的事情。使用调试器,我看到了会话中填充的对象,但随后在每次创建新会话时丢失了,就像使用这个简单的代码获取 sessionid 一样:

System.out.println("The session id is: " + session.getId());

会话 ID 为:EB431C19B41957B2BB2EFC3DBAF32241

会话ID为:C9CBD30E84D5C93DF6114C1412AE5523 然后我在 Header 下的 firebug 中看到了这个,response headers:

设置-Cookie JSESSIONID=C9CBD30E84D5C93DF6114C1412AE5523; Path=/此处省略名称/; HttpOnly,

所以我知道 cookie 已设置。我还删除了 jquery,并尽可能地剥离了 jsp 代码,但这似乎不是问题。

我正在使用: HttpSession 会话 = request.getSession(true);但使用 false 没关系。

session.setAttribute("ObjNameList", objNameList);

context.xml 的 cookie 设置为 true,我们确实使用 response.sendRedirect,但前提是抛出错误,如:response.sendRedirect("Error.jsp"); 代码中也没有会话无效的位置。

我在 jsp 中所做的只是使用类似的方式发回一个表单:

document.formName.submit(); 工作正常。使用此代码尝试在会话中设置一个简单的字符串也不起作用:

session.setAttribute("somevalue","someValue");

在此处的 servlet 中给我 null:

String val = (String) session.getAttribute("somevalue");

关于什么可能导致这种情况的任何想法?

结果:

原来是 url 的问题,实际上是一个拼写错误,正如 BalusC 所提到的,所以会话 cookie 的路径在 jsp 和 servlet 之间不匹配。

【问题讨论】:

  • 会话 cookie 绑定到特定的域+路径。只需在 webbrowser 的开发人员工具集中打开 HTTP 流量监视器并跟踪 cookie 流量。
  • 我有 firebug 和 live http headers。我刚刚添加了 httpfox 用于监控。这就是你的想法吗?
  • 是的,检查一下 cookie 的行为是否符合预期。
  • 您观察到服务器设置了cookies。但是客户端是否也在随后的请求中返回了它们?检查Cookie 标头。如果不存在,则显然在Set-Cookie 标头中设置的cookie 域+路径与需要设置Cookie 标头的请求不匹配。你是否修改过Tomcat或web.xml配置中的会话cookie路径? “此处省略名称”看起来很奇怪,因为它通常只代表上下文路径。
  • 不,当请求从 servlet 中的 jsp 返回时,会话为空。我会检查 cookie 标头。我没有为会话 cookie 设置任何内容,除了在 context.xml 中设置为 cookies="true"。此处省略名称意味着我不想放置实际的上下文路径。不,我没有修改 web.xml

标签: java jsp servlets frames httpsession


【解决方案1】:

仔细检查该 servlet 的请求 URL 是否与会话 cookie 域和路径匹配。如果不匹配,则浏览器根本不会将会话 cookie 与请求一起发回,服务器会认为无法建立会话,因此只会创建一个新会话。

您可以在浏览器的 Web 开发工具集的 HTTP 流量监视器中检查 cookie(在 Chrome/Firefox23+/IE9+ 中按 F12 并打开“网络”选项卡)。当新会话开始时,服务器必须返回带有Set-Cookie 标头的响应,其中包含cookie 值和路径(以及隐式域)。当浏览器在相同的域和路径上发送后续请求时,它一定是通过Cookie 请求标头将该cookie 传回。

另见:

【讨论】:

  • 感谢您抽出宝贵时间提供帮助!
猜你喜欢
  • 2017-01-03
  • 2012-08-08
  • 2011-01-09
  • 2013-01-28
  • 2020-07-13
  • 2018-09-16
  • 2021-06-15
  • 2013-10-26
  • 2016-08-07
相关资源
最近更新 更多