gpt4 book ai didi

java - 使用 Spring 安全性捕获注销/ session 超时

转载 作者:IT老高 更新时间:2023-10-28 21:00:06 26 4
gpt4 key购买 nike

我正在使用 spring/spring-security 3.1 并希望在用户注销时(或 session 超时)采取一些措施。我设法完成了注销操作,但 session 超时,我无法让它工作。

在 web.xml 中,我只指定了 ContextLoaderListener(这可能是问题吗?)当然还有 DelegatingFilterProxy。

我使用这样的自动配置。

    <security:http auto-config="false" use-expressions="false">
<security:intercept-url pattern="/dialog/*"
access="ROLE_USERS" />
<security:intercept-url pattern="/boa/*"
access="ROLE-USERS" />
<security:intercept-url pattern="/*.html"
access="ROLE-USERS" />

<security:form-login login-page="/auth/login.html"
default-target-url="/index.html" />
<security:logout logout-url="/logout"
invalidate-session="true"
delete-cookies="JSESSIONID" success-handler-ref="logoutHandler" />
</security:http>

<bean id="logoutHandler" class="com.bla.bla.bla.LogoutHandler">
<property name="logoutUrl" value="/auth/logout.html"/>
</bean>

当用户单击注销时调用注销处理程序,这将对数据库进行一些调用。

但是我该如何处理 session 超时???

处理它的一种方法是在用户登录时将用户名注入(inject) session ,然后使用普通的 httpsessionlistener 并在 session 超时时执行相同的操作。

spring security 有没有类似的方法,所以当 spring 发现 session 超时时,我可以卡在那里,访问 Authentication 并从那里获取 UserDetails 并进行清理。

最佳答案

我有一个更简单的解决方案。这适用于注销和 session 超时。

@Component
public class LogoutListener implements ApplicationListener<SessionDestroyedEvent> {

@Override
public void onApplicationEvent(SessionDestroyedEvent event)
{
List<SecurityContext> lstSecurityContext = event.getSecurityContexts();
UserDetails ud;
for (SecurityContext securityContext : lstSecurityContext)
{
ud = (UserDetails) securityContext.getAuthentication().getPrincipal();
// ...
}
}

}

web.xml:

<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

关于java - 使用 Spring 安全性捕获注销/ session 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com