Java 使用spring security的应用程序是否在其中共享SecurityContextHolder
我有两个不同的应用程序,比如Java 使用spring security的应用程序是否在其中共享SecurityContextHolder,java,session,spring-security,httpsession,Java,Session,Spring Security,Httpsession,我有两个不同的应用程序,比如A和。两者都使用相同配置的Spring安全性。以下是我的情况: 我登录我的应用程序。一切正常。但是,当我在同一浏览器的另一个选项卡中登录到我的B应用程序(它具有相同的IP但不同的端口)时,我看到了这些行(如下),我被从A应用程序中丢弃,这意味着我不再在其中进行身份验证 调试2013-05-20 13:42:43969[http-8080-2]org.springframework.security.web.FilterChainProxy$VirtualFilterC
A
和。两者都使用相同配置的Spring安全性。以下是我的情况:
我登录我的应用程序。一切正常。但是,当我在同一浏览器的另一个选项卡中登录到我的B
应用程序(它具有相同的IP但不同的端口)时,我看到了这些行(如下),我被从A
应用程序中丢弃,这意味着我不再在其中进行身份验证
调试2013-05-20 13:42:43969[http-8080-2]org.springframework.security.web.FilterChainProxy$VirtualFilterChain:/webapp/backoffice/index.jsp,位于附加过滤器链中12个位置中的第2个位置;正在启动筛选器:“SecurityContextPersistenceFilter”
调试2013-05-20 13:42:43969[http-8080-2]org.springframework.security.web.context.HttpSessionSecurityContextRepository:当前不存在HttpSession
调试2013-05-20 13:42:43969[http-8080-2]org.springframework.security.web.context.HttpSessionSecurityContextRepository:从HttpSession中没有可用的SecurityContext:null。将创建一个新的
我正在使用HttpSessionSecurityContextRepository
作为SecurityContextRepository
出于安全目的,我已启用了会话迁移
我正在使用ConcurrentSessionFilter,以防止有人通过两个或多个设备登录
但是我不明白为什么登录我的B
应用程序,会从A
应用程序中删除HttpSession?(或者其他一些事情正在发生)
我想知道这些应用程序是否在浏览器中共享一些共同点。
当我被问及他们的IP/端口时,您应该知道他们的IP相同(都是本地主机),但有不同的端口。
A)
localhost:8080/dtts/backoffice
B)
localhost:8081/dtts/backoffice
已解决
问题是,对于每个URL/Path
,都会有一个唯一的JSESSIONID
。我的两个应用程序都使用URL:localhost
和Path:dtts
。这就是为什么第二个JSESSIONID
替换第一个的原因。来自应用程序B的cookie正在覆盖存储在应用程序A浏览器中的cookie,因为两个cookie都来自同一服务器,即“localhost”,并且两个cookie都有名称,即“JSESSIONID”
Cookie不是特定于端口的。本问题对此进行了讨论:
我相信你的选择是:
- 使用不同的IP或服务器名称访问每个应用程序(例如。
localhost和127.0.0.1,或applicationA.mydomain.com和applicationB.mydomain.com)
- 请为会话使用其他名称
运行每个应用程序的容器中的cookie
每个应用程序的IP地址和端口是否都不同?我建议使用Fiddler之类的工具来分析每个web应用程序的往返流量,特别是JSESSIONID cookies的内容。请提供a的URL并更新答案。它们的IP相同(都是localhost
),但它们有不同的端口(A
使用8080,B
使用8081),听起来很符合逻辑!如何为这些应用程序提供不同的会话cookie名称?如果使用tomcat 7,则是Context.XML中的sessionCookieName属性。请参阅此处的文档:我已经阅读了文档,文档中说将“JSESSIONID”名称更改为其他名称不是一个好主意,因为Servlet默认使用此名称。是的,如果在部署模型中可能的话,第一个选项当然是解决此问题的更好方法。它是特定于路径的,与端口无关。因此,对于每个URL/Path
,都将有一个唯一的JSESSIONID
。我的问题是两个应用程序也使用相同的路径。