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

时间:2010-01-26 08:39:05

标签: java session tomcat servlets

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

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

我正在使用JSP / Servlet开发一个简单的java ee applcation。我在服务器机器中部署到tomcat之后才遇到问题。

10 个答案:

答案 0 :(得分:37)

一个可能的原因是具有“裸”主机名(即没有域部分的主机名)。如果您在Intranet中工作,这种情况相当普遍。

问题是几乎所有浏览器cookie都不接受没有域名的主机名的cookie。这样做是为了防止evilsite.comcom设置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 不能被客户端脚本修改。