Java 仅为当前请求修改SecurityContext

Java 仅为当前请求修改SecurityContext,java,spring,session,spring-security,spring-session,Java,Spring,Session,Spring Security,Spring Session,我使用的是SpringBoot+SpringSessionDataRedis 我的场景是UserA已经登录,并且为UserA创建了JSESSIONID,现在,他发布了一个令牌,该令牌将被发送到某台机器,并在几分钟内有效,以代表他工作。问题是,如果某个客户端意外地传递了Cookie和令牌,那么我希望在Spring会话中优先使用令牌而不是JSESSIONID。我无法使Cookie会话无效,因为它将注销不可用的UserA渴望的 所以,我想告诉spring wether使用现有会话或基于某些条件创建一个

我使用的是SpringBoot+SpringSessionDataRedis 我的场景是UserA已经登录,并且为UserA创建了JSESSIONID,现在,他发布了一个令牌,该令牌将被发送到某台机器,并在几分钟内有效,以代表他工作。问题是,如果某个客户端意外地传递了Cookie和令牌,那么我希望在Spring会话中优先使用令牌而不是JSESSIONID。我无法使Cookie会话无效,因为它将注销不可用的UserA渴望的
所以,我想告诉spring wether使用现有会话或基于某些条件创建一个新会话,并希望优先考虑令牌。并创建一个全新的会话,而不会使Cookie会话无效。

阅读官方文档

由此

@EnableRedisHttpSession 
public class Config {

        @Bean
        public LettuceConnectionFactory connectionFactory() {
                return new LettuceConnectionFactory(); 
        }
}
这是默认完成的

@EnableRedisHttpSession注释创建了一个名为springSessionRepositoryFilter的Springbean,它实现了过滤器。过滤器负责替换由Spring会话支持的HttpSession实现。在本例中,Spring会话由Redis支持

我们创建一个RedisConnectionFactory,将Spring会话连接到Redis服务器。我们将连接配置为在默认端口6379上连接到localhost。有关配置SpringDataRedis的更多信息,请参阅参考文档

DelegatingFilterProxy将查找名为springSessionRepositoryFilter的Bean,并将其转换为筛选器。对于调用DelegatingFilterProxy的每个请求,都将调用springSessionRepositoryFilter


所以,你要做的是避免弹簧配置,或者查找是否要以某种方式修改此默认行为,以创建自己的DelegatingFilterProxy实现并在ServletContext筛选器链中进行设置。

我可以通过提供自己的HttpSessionSecurityContextRepository实现,然后设置http.securityContext.securityContextRepositorynewCustomHttpSessionSecurityContextRepository;因此,我正在实现我自己的SaveContextOnUpdate或ErrorResponseRapper,在其中我没有保存上下文,因此它在会话中没有更改。