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

问题描述:

我有这个大问题。每当我向服务器发出新请求时,我的当前会话都会消失。会话丢失,并在每个servlet请求中创建为新的

我已经检查了很多地方。我找不到有什么问题。在tomcat和应用程序中,我也在web.xml中包含了 session-config。我还启用了接受cookie给我的浏览器。在每个浏览器中测试。它不工作。

我只是开发一个简单的Java ee applcation使用JSP/Servlet。只有在服务器机器上部署到Tomcat后,我才会遇到问题。

+0

Simial问题:http://*.com/q/13461838/698168 – 2013-08-23 12:43:05

经过多年,我从来没有在这里发布答案。那时我很忙,忘了这个问题。但是,今天我正在像往常一样寻找*中的解决方案,并看到这个通知提到我从这个问题中获得了点。看起来像其他开发人员正面临同样的问题。所以,我试图回想我是如何解决这个问题的。是的,我通过手动放回会话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); 
} 

尝试在Firefox中添加Live Http Headers plugin,并确保会话cookie确实从服务器传递到浏览器,并确保浏览器在下一次请求时再次发送它。

+2

或FireBug(http://getfirebug.com/) – Bozho 2010-01-26 08:56:08

+0

但是,如何?我在很多项目中使用过会话。我从来没有面对这个问题。你能给我怎样把它发回浏览器吗?它不仅发生在Firefox中,它也发生在其他浏览器中。 – 2010-01-26 09:00:19

+1

我并不是说它是与浏览器相关的,但该插件将允许您查看来回传递的Cookie(或者不是,视情况而定)。它不会告诉你为什么*,但它可能告诉你*什么*。 – skaffman 2010-01-26 09:51:02

请验证会话是否在您的代码在某处无效。寻找类似request.getSession().invalidate();

+0

我已经检查过。实际上,它在我的机器上工作正常,这是一台开发机器,但是,在服务器中 – 2010-01-26 08:52:52

+0

在这种情况下,您的开发服务器和您的实时服务器之间的配置明显不同。请添加您修改为问题的web.xml片段。 – 2010-01-26 09:43:07

首先检查代码,如果web应用程序的context.xml不已配置cookies="false"

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

如果不是原因,然后检查,如果你不使用HttpServletResponse.sendRedirect()因故每要求做重定向。如果您在第一次请求时已经这样做了,那么Cookie将会丢失。你需要通过

response.sendRedirect(response.encodeRedirectURL(url)); 
+0

我正在使用Forward ... – 2010-01-27 10:28:02

一个可能的原因,以取代

response.sendRedirect(url); 

这是有一个“裸”主机名(即一个没有域的一部分)。如果您在Intranet上工作,这很常见。

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

因此,如果您通过http://examplehost/访问您的应用程序,它将不会接受任何Cookie,而http://examplehost.localdomain/则会接受(并返回)Cookie。

关于讨厌的事情是,服务器无法与“浏览器得到的cookie,并忽略了它”和“浏览器从来没有cookie的”区别开来。因此,每个单一访问将看起来像一个全新的服务器。

+0

即使在使用本地主机的服务器中,我也已经使用应用程序进行了测试。它导致相同的问题。在这个项目中,我使用了Jersey REST服务,JCaptcha和自定义标签。 – 2010-01-27 10:22:03

+0

非常奇怪的是,我在服务器上安装了Glassfish,并在glassfish上部署应用程序。仍然是同样的问题... 我完全失去了。 – 2010-01-27 10:23:04

+0

我已经将我的机器链接名称从IP更改为machinene.localdomain,并且我的问题已解决!谢谢 – jcrada 2013-04-15 20:54:12

编辑你的Tomcat context.xml文件并替换<Context>标签<Context useHttpOnly="false">,这帮助了我。

我经历了陈旧HTTPS会话cookie(我的ad-hoc项)的问题,由于安全标志。

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

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

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly 

字安全只出现在HTTPS连接,并创建这个陈旧的cookie。这是一个SecureFlag(请参阅OWASP)。有办法在服务器端禁用这个标志,这似乎是一个永久的解决方案,但可能并不安全。

或者它是一个浏览器错误,cookie不会被覆盖?

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

在属性

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

删除这些设置,它会保留您的会话cookie,它被重置的每个请求。