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

Min*_*Soe 36 java session tomcat servlets

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

我检查了很多地方.我找不到问题所在.我还在tomcat和application中都包含了web.xml中的session-config.我还启用了接受我的浏览器的cookie.在每个浏览器中测试.它不起作用.

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

Joa*_*uer 39

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

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

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

令人讨厌的是,服务器无法区分"浏览器获取cookie并忽略它"和"浏览器从未获得cookie".因此,每个单一访问对服务器来说都是一个全新的sesson.


Min*_*Soe 24

多年以后,我从来没有在这里发布答案.那时我很忙,忘记了这个问题.但是,今天我像往常一样在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);
}
Run Code Online (Sandbox Code Playgroud)


LNT*_*LNT 7

In Your properties

  server.session.cookie.http-only=true
  server.session.cookie.secure=true
Run Code Online (Sandbox Code Playgroud)

删除这些设置,它将保留您的会话 ID cookie,每次请求都会重置它。


Bal*_*usC 6

首先检查是否web应用程序的context.xml没有cookies="false"配置。

此外,很高兴知道cookie是依赖于域,端口和上下文路径的。如果页面中的链接指向与当前请求URL(您在浏览器的地址栏中看到的URL)相对的其他域,端口和/或上下文路径,则该cookie将不会通过,这将导致会话无法再被识别,因此您将从servlet容器中获得一个新会话。

如果不是这个原因,请检查您是否由于某种原因未对每个请求进行重定向。如果您在第一个请求中已经这样做,那么cookie将丢失。您需要更换HttpServletResponse.sendRedirect()

response.sendRedirect(url);
Run Code Online (Sandbox Code Playgroud)

通过

response.sendRedirect(response.encodeRedirectURL(url));
Run Code Online (Sandbox Code Playgroud)


Jar*_*zek 5

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

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

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

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly
Run Code Online (Sandbox Code Playgroud)

“安全”一词仅出现在 https 连接中并创建此过时的 cookie。它是一个 SecureFlag(请参阅OWASP)。有多种方法可以在服务器端禁用此标志,这似乎是一个永久的解决方案,但可能不安全。

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