http - 为什么spring security会注销用户?

标签 http java session xml

我可以使用 jsp、servlet 和通用数据存储(hibernate)通过 HTTP 在不同端口号上使用 jetty 启动 2 个项目。其中一个项目是“公共(public)”Web(端口8080),另一个项目是“管理Web”(端口8899),其中管理Web使用Spring Security进行登录/注销。但是,当我从不使用 Spring Security 的公共(public)网络(端口 8080)进行插入时,与端口 8899 的 Spring Security 的 session 被破坏,我被注销,必须再次登录才能查看来自公共(public)网络的更新端口 8080。这两个项目在 Maven jetty 插件配置中具有相同的上下文(“/foo”),但在不同的端口上,因此行为有些意外。如果我使用 2 个不同的上下文,例如/foo 在端口 8080 上,/zar 在端口 8899 上,那么 Spring Security session 仍然存在。是否有某种原因导致配置不能为不同端口提供相同的上下文,或者其他原因可以解释为什么用户在另一个项目的另一个端口号插入数据库后会注销?

最佳答案

Is there some reason for why the configuration can't have identical context for different ports

是的。 cookie 标准规定,不同端口上的服务算作同源。这是不幸的,因为它与 JavaScript 同源策略不同,而且它几乎从来都不是您想要的,但我们现在坚持它。

因此,如果您在端口 8080 服务上设置 JSESSIONID cookie,它将覆盖之前由端口 8999 服务设置的任何 JSESSIONID cookie。当您返回 8999 服务时,8080 服务生成的 cookie 是未知的,因此无法识别您已登录。

解决方法包括:

  1. 使用不同的路径;
  2. 覆盖默认 session ID Cookie 名称,以便每个应用都有不同的 Cookie ( <session-config><cookie-config><name> );
  3. 在应用之间手动共享 session (例如 Tomcat 中的 crossContext="true")。

我建议(2)。

关于http - 为什么spring security会注销用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22355752/

相关文章:

iOS,使用多部分表单数据上传文件

python - SqlAlchemy 中单独的 REST 请求的单独 session 对象?

即使设置了值,PHP $_SESSION 也返回空数组

php - 多个 PHP session

angular - 您如何将 json res 数据解析为 http observable 中的模型?

java - Spring Integration - 如何使用 http 出站网关发送 POST 参数

javascript - 如何在不丢失数据的情况下将 POST 正文数据传递到另一条路线?

Java ArrayList 删除元素恢复浪费的空间?

java - JPanel 的 JButtons 自定义绘图出现图形故障

java - 如何使用 Chronicle Map 在随机索引上使用 get/set 序列化/反序列化 long[] 值?