我可以通过jsp、servlet和公共数据存储(hibernate)在http上启动两个不同端口号的jetty项目。其中一个项目是“public”web(端口8080),另一个项目是“adminweb”(端口8899),其中adminweb使用springsecurity进行登录/注销。但是,当我从不使用spring security的公共web(端口8080)进行插入时,spring security与端口8899的会话中断,我注销,必须再次登录才能在端口8080上查看公共web的更新。这两个项目在maven jetty插件配置中具有相同的上下文(“/foo”),但在不同的端口上,因此行为有些出乎意料。如果我使用两个不同的上下文,例如端口8080上的/foo和端口8899上的/zar,那么spring安全会话将继续。为什么配置不能为不同的端口提供相同的上下文,或者有什么原因可以解释为什么用户在另一个项目的另一个端口号插入数据库后会注销?
1条答案
按热度按时间7hiiyaii1#
为什么配置不能为不同的端口提供相同的上下文
对。cookie标准规定,不同端口上的服务被视为同一来源。这是不幸的,因为它不同于javascript同源策略,而且它几乎从来都不是您想要的,但我们现在仍然坚持使用它。
因此,如果在端口8080服务上设置jsessionid cookie,它将覆盖端口8999服务之前设置的任何jsessionid cookie。当您返回8999服务时,8080服务生成的cookie是未知的,因此您不会被识别为已登录。
解决方法包括:
使用不同的路径;
重写默认会话id cookie名称,以便每个应用都有不同的cookie(
<session-config><cookie-config><name>
);在应用程序之间手动共享会话(例如
crossContext="true"
在tomcat中)。我建议(2)。