我有这个大问题。每当我向服务器发出新请求时,我当前的会话都会消失。
我已经检查了很多地方。我找不到问题所在。我也包括在内 在tomcat和应用程序中的web.xml中的session-config。我还启用了接受我的浏览器的cookie。在每个浏览器中测试。它不起作用。
我正在使用JSP / Servlet开发一个简单的java ee applcation。我在服务器机器中部署到tomcat之后才遇到问题。
答案 0 :(得分:37)
一个可能的原因是具有“裸”主机名(即没有域部分的主机名)。如果您在Intranet中工作,这种情况相当普遍。
问题是几乎所有浏览器cookie都不接受没有域名的主机名的cookie。这样做是为了防止evilsite.com
为com
设置Cookie(这将是糟糕的,因为它将是最终的跟踪Cookie)。
因此,如果您通过http://examplehost/
访问您的应用,则不会接受任何Cookie,而对于http://examplehost.localdomain/
,它会接受(并返回)Cookie。
令人讨厌的是,服务器无法区分“浏览器获取cookie并忽略它”和“浏览器从未获得cookie”。因此,每次单一访问对服务器来说都是一个全新的sesson。
答案 1 :(得分:15)
多年以后,我从来没有在这里发布答案。那时我很忙,忘记了这个问题。但是,今天我像往常一样在Stackoverflow中寻找解决方案,看到这个通知提到我从这个问题得到了积分。似乎其他开发人员面临同样的问题。所以,我试着回忆起我是如何解决这个问题的。是的,我通过手动放回会话ID来跟踪/维护会话ID解决了。
请参阅我在servlet中手动放回jsessionid的代码。
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);
}
答案 2 :(得分:4)
首先检查网络应用的context.xml
不是否配置了cookies="false"
。
此外,最好知道cookie依赖于域,端口和上下文路径。如果页面中的链接指向不同的域,端口和/或上下文路径而不是当前请求URL(您在浏览器的地址栏中看到的那个),那么cookie将不会通过,这将导致无法再识别会话,因此您将从servletcontainer中获取一个新的。
如果这不是原因,那么出于某种原因,请使用HttpServletResponse.sendRedirect()
检查您是否在每次请求中进行重定向。如果您在第一次请求时已经这样做,那么cookie就会丢失。你需要更换
response.sendRedirect(url);
通过
response.sendRedirect(response.encodeRedirectURL(url));
答案 3 :(得分:3)
尝试将Live Http Headers plugin添加到firefox,并确保会话cookie确实从服务器传递到浏览器,并确保浏览器在下次请求时再次发送回来。
答案 4 :(得分:3)
请验证代码是否在代码中无效。查找与request.getSession().invalidate();
答案 5 :(得分:2)
由于安全标志,我遇到了过时的https会话cookie (我的临时条款)问题。
在http和https之间切换时出现此问题。 https会话存储的cookie从未被http会话覆盖。它永远存在于FireFox记忆中。它在FireFox中显示工具/选项/隐私/删除单个cookie 在发送字段中,仅用于安全连接。清除此单个cookie或所有cookie是一种解决方法。
我正在用wget调试问题,我注意到了这样的标题:
Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly
单词secure仅出现在https连接中并创建此陈旧cookie。它是一个SecureFlag(见OWASP)。有一些方法可以在服务器端禁用这个标志,这似乎是一个永久的解决方案,但可能不安全。
或者它是一个浏览器错误,cookie没有被覆盖?
答案 6 :(得分:1)
编辑您的tomcat context.xml
文件并将<Context>
标记替换为<Context useHttpOnly="false">
,这对我有帮助。
答案 7 :(得分:1)
如果存在负载平衡配置,则必须配置网络中的路由以保留同一服务器中的请求。否则,每个请求将转到另一个服务器,从而丢失会话属性。
答案 8 :(得分:0)
在您的属性中
server.session.cookie.http-only=true
server.session.cookie.secure=true
删除这些设置,它将保留您的会话ID cookie,每次请求都会重置该cookie。
答案 9 :(得分:0)
您是通过 http 还是 https 连接? 对于 servlet,我的会话 cookie 具有属性“安全”和“httpOnly”。 “安全”意味着用户代理只会在传输是安全的 (https/tls) 时发送 cookie。如果您使用 http 连接,则会在每个请求上创建一个新会话。 'httpOnly' 表示 cookie 不能被客户端脚本修改。