手动过期Spring安全会话

时间:2013-05-03 13:54:48

标签: spring sessionid

我使用Spring Security。我不知道如何在一个进程中使Spring Security会话到期。

我尝试了这个,但它给出了一个空指针异常:

List<SessionInformation> allSessions;

SessionRegistry sessionRegistry;

// this line returns a null pointer exception
allSessions = sessionRegistry.getAllSessions("userName", true); 

if (allSessions != null) {
    for (SessionInformation sessionInformation : allSessions) {
        logger.info("Expiring session for user: "
            + username
            + " - "
            + sessionInformation.getSessionId());

        sessionInformation.expireNow();
    }
}

1 个答案:

答案 0 :(得分:0)

SessionRegistry不是框架的核心组件,因为它不需要确保其正常功能。因此,您需要执行一些其他配置来指示框架创建和维护它。

将此内容包含在<http>标记内的Spring Security配置中:

<security:session-management>
    <security:concurrency-control max-sessions="100"/>
</security:session-management>

使用concurrency-control标记会导致SessionRegistry与框架的其他组件正确连接。由于此工具最初是为允许用户可能拥有的会话数量限制的配置而开发的,因此您需要设置max-sessions属性(否则默认为1)。如果您不想要这种“副作用”,请给出足够高的数字。

另外,请在web.xml

中加入此内容
<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

需要这样做,以便在用户会话结束时通知SessionRegistry

之后,不要忘记将@Autowired添加到代码中SessionRegistry字段的声明中,或确保以其他方式注入。

阅读此short chapter参考文档,了解有关Spring Security中会话管理的更多信息。