繁体   English   中英

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

[英]Session is lost and created as new in every servlet request

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

我查了很多地方。 我找不到什么问题。 我还在 tomcat 和应用程序中的 web.xml 中包含了 session-config。 我还允许在我的浏览器中接受 cookie。 在每个浏览器中测试。 它不起作用。

我只是在使用 JSP/Servlet 开发一个简单的 java ee 应用程序。 只有在我在服务器机器上部署到 tomcat 之后,我才面临这个问题。

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

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

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

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

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

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

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

如果这不是原因,那么检查您是否出于某种原因没有使用HttpServletResponse.sendRedirect()每个请求进行重定向 如果您在第一次请求时就已经这样做了,那么 cookie 将会丢失。 你需要更换

response.sendRedirect(url);

经过

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

在您的物业

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

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

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

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

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

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly

安全一词仅出现在 https 连接中并创建此陈旧 cookie。 这是一个 SecureFlag(参见OWASP )。 有一些方法可以在服务器端禁用此标志,这似乎是一个永久的解决方案,但可能不安全。

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

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

请验证会话是否在您的代码中的某处无效。 寻找类似于request.getSession().invalidate();

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

编辑您的 tomcat context.xml文件并将<Context>标记替换为<Context useHttpOnly="false"> ,这对我有帮助。

你是通过http还是https连接? 对于 servlet,我的会话 cookie 具有属性“安全”和“httpOnly”。 “安全”意味着用户代理只会在传输是安全的 (https/tls) 时发送 cookie。 如果您使用 http 连接,则会在每个请求上创建一个新会话。 'httpOnly' 表示 cookie 不能被客户端脚本修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM