首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Spring会话中从SessionDestroyedEvent获取安全上下文

在Spring会话中从SessionDestroyedEvent获取安全上下文
EN

Stack Overflow用户
提问于 2015-07-16 21:53:41
回答 2查看 1.6K关注 0票数 0

我正在使用Session 1.0.1。我需要在用户注销时执行一些逻辑,并且我需要依赖于HTTP会话无效,以解决用户无法显式注销的情况。

标准的Security包含任何适用的SecurityContext,但是SessionDestroyedEvent的Session版本只包含会话id。当此事件触发时,会话不再由SessionRepository持有,因此不能由id查找。

有没有任何方法可以使用Spring会话从过期的会话中检索SecurityContext?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-21 03:51:47

不幸的是没有。问题是,在Redis触发事件时,会话已经结束。此外,从Redis收到的事件不包含原始信息。这意味着无法检索SecurityContext。

有关此方面的更新,请跟踪春季-项目/春季-会议/议题/4

票数 2
EN

Stack Overflow用户

发布于 2017-11-23 11:31:32

对于sring会话1.1+和Redis https://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession-httpsessionlistener

您必须配置HttpSessionEventPublisher,并且在那个春季会话之后将传播sessionDestroy事件。

代码语言:javascript
运行
复制
@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {

        @Bean
        public HttpSessionEventPublisher httpSessionEventPublisher() {
                return new HttpSessionEventPublisher();
        }

        // ...
}

所以您可以使用标准的spting SessionDestroyedEvent监听器。

代码语言:javascript
运行
复制
@Component
public class SessionDestroyListener implements ApplicationListener<SessionDestroyedEvent> {

    @Override
    public void onApplicationEvent(SessionDestroyedEvent event) {
        logger.debug("session destroyed {}", event.getId());
        if(!event.getSecurityContexts().isEmpty()) {
           ...
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31465177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档