0

我使用弹簧安全。我不知道如何在进程中使 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();
    }
}
4

1 回答 1

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,或确保以其他方式注入。

阅读参考文档的这一简短章节,了解有关 Spring Security 中会话管理的更多信息。

于 2013-05-03T15:13:16.133 回答