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

使用JSP的每个servlet请求创建新会话?

虞华翰
2023-03-14

我有一个遗留的Java1.6运行localhostTomcat 7应用程序使用JSP页面,一个带有框架的框架集,javascript,但没有像Struts这样的框架。我使用请求或会话从servlet传递一个对象以在页面中显示,这很好。

然而,我最近做了一些更改,现在我无法从会话或请求中检索到相同的对象。它以前工作得很好,所以我不确定是什么坏了,但我甚至无法将字符串值从JSP返回到servlet。

我创建了一个新的精简JSP,使用请求或会话都无法从中获得任何信息。当我将代码推送到Tomcat 6 web服务器时,它也会做同样的事情。使用调试器,我可以看到在会话中填充的对象,但在以后每次创建新会话时都会丢失,就像使用以下简单代码获取会话ID一样:

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

会话id为:EB431C19B41957B2BB2EFC3DBF2241

会话ID是:C9CBD30E84D5C93DF6114C1412AE5523然后我在Header下的Firebug中看到了这一点,响应标头:

设置Cookie JSESSIONID=C9CBD30E84D5C93DF6114C1412AE5523;Path=/Name此处省略/;HttpOnly,

所以我知道饼干已经做好了。我还删除了jquery,并尽可能地剥离jsp代码,但这似乎不是问题所在。

我使用的是:HttpSession=request。getSession(真);但使用false并不重要。

session.setAttribute("ObjNameList", objNameList);

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

我在jsp中所做的就是使用如下方式发送表单:

文档。formName。提交() 这很好用。使用此代码尝试在会话中设置简单字符串也不起作用:

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

在servlet中为空:

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

你知道是什么导致了这一切吗?

结果:

事实证明这是url的问题,实际上是一个错字,正如BalusC所提到的,因此会话cookie的路径在jsp和servlet之间不匹配。


共有1个答案

有耀
2023-03-14

双重检查该servlet的请求URL是否与会话cookie域和路径匹配。如果不匹配,那么浏览器就不会将会话cookie与请求一起发送回去,服务器会认为无法建立会话,因此只会创建一个新的会话。

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

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

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 问题内容: 我有一堂课 不确定规范对HTTPServlet的回收有何评论:servlet容器是否应该在每个传入请求上创建此类的新实例,或者实现可以在请求之间重用类? 我正在调查一个有趣的问题,其中似乎是在GAE_SERVLETREQUESTServlet实例上创建的Map保持了请求之间的状态。 问题答案: 对于一般情况-非分布式,多线程的,可以保证只有servlet的一个实例。根据Servlet

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

  • 问题内容: 我有两个变量“ userId”和“ name”。例如,当我单击“ SHOW USERID”按钮时,它可以正常工作并设置为“ renderUserId = true”,并使用“ render”显示它,但是如果我单击另一个“ SHOW”按钮,则表示Bean处于重建状态并且松动了“ renderUserId = true”,它变为“ false”和“ renderName = true”,因

  • 我不明白在spring mvc中使用dispatcher servlet只创建了一个bean对象,还是每个请求都创建了一个新对象? 控制器代码:- 在代码中,我在LoginBean对象中设置数据,并在方法abc中的modelandview对象中设置它。 然后,在jsp中,我没有为usename输入任何值,在这种情况下,当我提交表单并调用处理程序方法(initform)时,我试图打印相同的lb.ge