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

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

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

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

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

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

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

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

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

首先检查webapp的context.xml是否配置了cookies="false"

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

如果这不是原因,那么出于某种原因检查您是否在使用HttpServletResponse.sendRedirect() 每个请求上进行重定向 。 如果您已在第一次请求时执行此操作,则cookie将丢失。 你需要更换

 response.sendRedirect(url); 

通过

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

尝试将Live Http Headers插件添加到firefox,并确保会话cookie确实从服务器传递到浏览器,并确保浏览器在下一个请求时再次发送回来。

请validation代码是否在某个地方的代码中无效。 查找类似于request.getSession().invalidate();代码request.getSession().invalidate();

由于安全标志,我遇到了陈旧的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没有被覆盖?

编辑tomcat context.xml文件并将标记替换为 ,这对我有帮助。

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

在您的属性中

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

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