【问题标题】:Java servlet session id changes on every requestJava servlet 会话 ID 在每个请求上都会更改
【发布时间】:2024-01-23 14:40:01
【问题描述】:

我有一个 Web 应用程序,其中前端通过 vue-cli 开发并在 localhost:8081 上运行,后端是使用 tomcat 的单独项目并在 localhost:8080 上运行

后端有一个控制器 servlet,它基于一个动作,控制器将工作委托给另一个 servlet。 当登录页面向控制器提交登录信息时,控制器会创建 HttpSession,调用验证凭据的 LoginServlet,然后将响应发送给控制器,控制器将响应登录页面。到目前为止,如果我们检查 ControllerServlet 和 LoginServlet 上的 HttpSession,它们完全匹配。

现在登录已经成功 vue-router 向我们推送 url 上的 admin 组件:localhost:8081/admin,此时我们有两个 get 请求,都发给 ControllerServlet,后者会将工作委托给另一个 servlet。如果我们检查控制器上的会话和第三个 servlet,它们匹配。但是,如果我们从这 3 个请求中检查 HttpSession,它们都彼此不同,servlet 会为每个请求创建一个新请求。如何使这个 HttpSession 持久化?是vue跑在8081上,后端在8080上的问题吗?

【问题讨论】:

    标签: java vue.js servlets vue-cli httpsession


    【解决方案1】:

    到目前为止,如果我们检查 ControllerServlet 上的 HttpSession 和 他们完美匹配的 LoginServlet。

    当然,它们会匹配,因为 ControllerServletLoginServlet 的会话是由同一台服务器(在端口 8080 上运行)创建的。

    运行在 8080 端口的服务器创建的会话与运行在 8081 端口的服务器没有关系,因此期望它们匹配是错误的。在最罕见的情况下,如果它们匹配,那可能只是巧合。

    运行在端口 8081 的服务器可以获取运行在端口 8080 的服务器创建的会话的唯一方法是通过持久化和查询会话,即您必须持久化运行在端口的服务器创建的会话端口,8080 到一个数据存储(DB,NFS 等),从该端口运行的服务器,8081 必须查询并获取它。

    【讨论】: