Java 会话丢失,并在每个servlet请求中创建为新会话

Java 会话丢失,并在每个servlet请求中创建为新会话,java,session,tomcat,servlets,Java,Session,Tomcat,Servlets,我有个大问题。每次我向服务器发出新请求时,当前会话都会消失 我在很多地方都登记过。我找不到有什么问题。我还包括 tomcat和应用程序中web.xml中的会话配置。我还允许我的浏览器接受cookie。在每个浏览器中测试。它不起作用了 我正在使用JSP/Servlet开发一个简单的JavaEE应用程序。只有在服务器机器中部署到tomcat之后,我才面临此问题。尝试将添加到firefox,并确保会话cookie确实从服务器传递到浏览器,并确保浏览器在下一次请求时再次将其发送回。请验证会话是否在您的代

我有个大问题。每次我向服务器发出新请求时,当前会话都会消失

我在很多地方都登记过。我找不到有什么问题。我还包括 tomcat和应用程序中web.xml中的会话配置。我还允许我的浏览器接受cookie。在每个浏览器中测试。它不起作用了


我正在使用JSP/Servlet开发一个简单的JavaEE应用程序。只有在服务器机器中部署到tomcat之后,我才面临此问题。

尝试将添加到firefox,并确保会话cookie确实从服务器传递到浏览器,并确保浏览器在下一次请求时再次将其发送回。

请验证会话是否在您的代码中的某个位置无效。查找类似于
request.getSession().invalidate()的代码

首先检查webapp是否配置了
cookies=“false”

此外,最好知道Cookie依赖于域、端口和上下文路径。如果页面中的链接指向不同的域、端口和/或上下文路径,而不是当前的请求URL(您在浏览器的地址栏中看到的URL),那么cookie将不会被传递,这将导致会话无法再被识别,因此您将从servletcontainer获得一个新的

如果这不是原因,那么请检查您是否出于某种原因没有使用
HttpServletResponse.sendRedirect()
对每个请求执行重定向。如果您在第一次请求时就已经这样做了,那么cookie就会丢失。你需要换个新的

response.sendRedirect(url);


一个可能的原因是有一个“裸”主机名(即没有域部分的主机名)。如果您在内部网中工作,这是很常见的

问题是,几乎所有浏览器cookie都不会接受没有域名的主机名cookie。这样做是为了防止
evilsite.com
com
设置Cookie(这将是不好的,因为这将是最终的跟踪Cookie)

因此,如果您通过
http://examplehost/
它不会接受任何cookie,而对于
http://examplehost.localdomain/
它会很好地接受(并返回)cookie


令人讨厌的是,服务器无法区分“浏览器获得了cookie并忽略了它”和“浏览器从未获得cookie”。因此,每一次访问对服务器来说都将是一次全新的体验。

多年后,我从未在这里发布过答案。当时我很忙,忘记了这个问题。但是,今天我像往常一样在Stackoverflow中寻找解决方案,看到这个通知提到我从这个问题中得到了分数。似乎其他开发者也面临同样的问题。所以,我试着回忆我是如何解决这个问题的。是的,我通过手动放回会话id来跟踪/维护会话id来解决

请参阅我手动将jsessionid放回servlet中的代码

HttpSession session = request.getSession();
if (request.getParameter("JSESSIONID") != null) {
    Cookie userCookie = new Cookie("JSESSIONID", request.getParameter("JSESSIONID"));
    response.addCookie(userCookie);
} else {
    String sessionId = session.getId();
    Cookie userCookie = new Cookie("JSESSIONID", sessionId);
    response.addCookie(userCookie);
}

编辑tomcat
context.xml
文件并将
标记替换为
,这对我很有帮助。

由于安全标志,我遇到了一个陈旧的https会话cookie(我的临时术语)问题

我在http和https之间切换时遇到了这个问题。https会话存储的cookie从未被http会话覆盖。它永远留在FireFox的记忆中。它在FireFox工具/选项/隐私/删除单个cookie中可见,而在Send for字段中,它仅用于安全连接。清除此单个cookie或所有cookie是一种解决方法

我正在调试wget的问题,我注意到这样一个标题:

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly
“安全”一词仅出现在https连接中,并创建此陈旧cookie。这是一个安全标志(请参阅)。有很多方法可以在服务器端禁用此标志,这似乎是一个永久的解决方案,但可能并不安全


或者是浏览器错误,cookie没有被覆盖?

如果有负载平衡配置,则必须在网络中配置路由,以便在同一服务器中保留请求。否则,每个请求将转到不同的服务器,从而丢失会话属性。

在属性中

  server.session.cookie.http-only=true
  server.session.cookie.secure=true

删除这些设置后,它将保留会话id cookie,每次请求都会重置该cookie。

我已经检查过了。实际上,它在我的开发机器上运行得很好,但是在服务器上,在这种情况下,dev服务器和live服务器之间的配置显然存在差异。请将您修改的web.xml代码片段添加到您的问题中。但是,如何添加?我在很多项目中使用了会话。我从未面对过这个问题。您能告诉我如何将其发送回浏览器吗?这不仅发生在Firefox中,其他浏览器中也会发生。我不是说它与浏览器相关,但该插件将允许您看到cookie来回传递(或者不传递,视情况而定)。它不会告诉你为什么,但它可能会告诉你什么;Path=/myapp,我在刷新页面后得到了它。设置Cookie:JSESSIONID=F23780E7F8085624EBF25F3EB3DFF45D;Path=/myappI已经在使用localhost的服务器上对应用程序进行了测试。这导致了同样的问题。在这个项目中,我使用了Jersey REST服务、JCaptcha和自定义标记。非常奇怪的是,我在服务器上安装了Glassfish,并在Glassfish上部署了应用程序。还是一样的问题。。。我完全迷路了。我已将我的计算机链接名称从IP更改为machinene.localdomain,问题已解决!。谢谢,我在localhost和Chrome上遇到了这个问题。奇怪的是,当重新启动或设置刚刚重置时,浏览器接受本地主机的cookies。但是,
  server.session.cookie.http-only=true
  server.session.cookie.secure=true