繁体   English   中英

Spring Security为什么注销用户?

[英]Why does spring security log out the user?

我可以使用jsp,servlet和公用数据存储(休眠)通过HTTP在不同端口号上的码头上启动2个项目。 其中一个项目是“公共”网站(端口8080),另一个项目是“管理网站”(端口8899),其中管理网站使用spring security进行登录/注销。 但是,当我从不使用Spring Security的公共Web(端口8080)插入内容时,带有Spring Security的端口8899的会话中断了,我注销了,必须再次登录才能从公共Web上查看更新。端口8080。这两个项目在maven jetty插件配置中具有相同的上下文(“ / foo”),但是在不同的端口上,因此行为有些出乎意料。 如果我使用2个不同的上下文,例如端口8080上的/ foo和端口8899上的/ zar,那么spring安全会话将持续存在。 是否有某些原因导致配置的不同端口无法具有相同的上下文,或者其他原因解释了为什么用户在数据库插入另一个项目的另一个端口号后注销用户?

为什么配置对于不同的端口不能具有相同的上下文,是否有某些原因

是。 Cookie标准规定,不同端口上的服务计为同一来源。 不幸的是,它与JavaScript相同原产地政策不同,几乎从来都不是您想要的,但是我们现在坚持使用它。

因此,如果您在端口8080服务上设置了JSESSIONID cookie,它将覆盖端口8999服务设置的所有先前的JSESSIONID cookie。 当您返回8999服务时,由8080服务生成的cookie是未知的,因此您不会被识别为已登录。

解决方法包括:

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

我建议(2)。

暂无
暂无

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

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