会话丢失,并在每个servlet请求中创建为新的
我有这个大问题。每当我向服务器发出新请求时,我的当前会话都会消失。会话丢失,并在每个servlet请求中创建为新的
我已经检查了很多地方。我找不到有什么问题。在tomcat和应用程序中,我也在web.xml中包含了 session-config。我还启用了接受cookie给我的浏览器。在每个浏览器中测试。它不工作。
我只是开发一个简单的Java ee applcation使用JSP/Servlet。只有在服务器机器上部署到Tomcat后,我才会遇到问题。
经过多年,我从来没有在这里发布答案。那时我很忙,忘了这个问题。但是,今天我正在像往常一样寻找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);
}
请验证会话是否在您的代码在某处无效。寻找类似request.getSession().invalidate();
我已经检查过。实际上,它在我的机器上工作正常,这是一台开发机器,但是,在服务器中 – 2010-01-26 08:52:52
在这种情况下,您的开发服务器和您的实时服务器之间的配置明显不同。请添加您修改为问题的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));
我正在使用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的”区别开来。因此,每个单一访问将看起来像一个全新的服务器。
即使在使用本地主机的服务器中,我也已经使用应用程序进行了测试。它导致相同的问题。在这个项目中,我使用了Jersey REST服务,JCaptcha和自定义标签。 – 2010-01-27 10:22:03
非常奇怪的是,我在服务器上安装了Glassfish,并在glassfish上部署应用程序。仍然是同样的问题... 我完全失去了。 – 2010-01-27 10:23:04
我已经将我的机器链接名称从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,它被重置的每个请求。
Simial问题:http://stackoverflow.com/q/13461838/698168 – 2013-08-23 12:43:05