当前位置: 首页 > 面试题库 >

使用Spring Security捕获注销/会话超时

陈松
2023-03-14
问题内容

我正在使用spring / spring-security
3.1,希望在用户注销(或会话超时)时采取一些措施。我设法完成了注销操作,但对于会话超时,我无法使其正常工作。

在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>

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

但是我该如何处理会话超时?

一种解决方法是在用户登录时将用户名注入会话中,然后使用普通的httpsessionlistener并在会话超时时执行相同的操作。

spring安全性是否也有类似的方法,所以当spring发现会话即将超时时,我可以挂接到那里,访问Authentication并从那里获取UserDetails并进行清理。


问题答案:

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

@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>


 类似资料:
  • 我使用的是spring/spring-security 3.1,希望在用户注销时(或者会话超时)采取一些操作。我设法完成了注销的操作,但对于会话超时,我无法使其工作。 处理它的一种方法是在用户登录时将用户名注入会话,然后使用普通的httpsessionlistener,并在会话超时时执行相同的操作。 spring security是否有类似的方法,以便当spring发现会话要超时时,我可以挂接在那

  • 是否有可能“拦截”会话超时? 我尝试了,但据我所知,当调用HttpSessionListener.session毁灭()'方法时,会话已经被摧毁。(所以我没有机会确定用户,拥有超时的会话) 另一个选项是PhaseListener,在restoreView阶段检查会话是否是“新的”。 但是,我需要在会话超时的“第二天”执行一些操作-不在以后的刷新中执行,也不在以后的登录中执行。 (背景:需要删除某些

  • 我正在学习springsecurity(基于java的配置),我无法使注销正常工作。当我点击注销时,我看到URL更改为http://localhost:8080/logout并获取“HTTP 404-/logout”。登录功能工作正常(即使使用自定义登录表单),但问题是注销,我怀疑重定向的url“localhost:8080/logout”应该类似于“localhost:8808/springte

  • 问题内容: 我在iOS应用中使用Firebase身份验证。当用户使用Firebase登录我的应用程序然后注销该用户的所有其他设备(会话)时,Firebase中是否有任何方法?我可以使用Firebase admin SDK来做到这一点吗? 问题答案: 当我遇到此问题时,我已使用云功能解决了该问题,请访问此链接以获取更多详细信息https://firebase.google.com/docs/auth

  • 只是一个关于Spring Security性和会话失效的问题。 当会话被ConcurrentSessionControlStrategy无效时,会话将通过调用removeSessionInformation方法从SessionRegistry中移除;然而,当会话被手动注销无效时,HttpSession也会无效,但不会调用SessionRegistry从那里移除条目。 我添加了HttpSession

  • 问题内容: 我有一个会话验证过滤器,当会话过期时该过滤器注销用户。 这是一段代码,但是没有用。不起作用意味着即使会话过期,它也不会重定向到登录页面。 请帮助我解决此问题。 问题答案: 我有一个会话验证过滤器,当会话过期时该过滤器注销用户。 老实说,这完全没有道理。如果将已登录用户存储为会话的属性,并基于会话中已登录用户的存在来拦截“已登录”状态,则在任何时候都不需要手动注销该用户。会话已过期。当会