如何在 Spring 中处理不成功的注销?

Posted

技术标签:

【中文标题】如何在 Spring 中处理不成功的注销?【英文标题】:How to handle unsuccessful Logout in Spring? 【发布时间】:2019-09-07 19:26:44 【问题描述】:

在我的 Spring Security 中,我不会立即使会话无效,但我是在 LogoutSuccessHandler 中进行的(需要为注销后调查保留一些信息) 这让我明白了:如果注销出错,我应该如何使会话无效?

HttpSecurity:

        http.authorizeRequests()
                ...
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(myLogoutSuccessHandler())
                .invalidateHttpSession(false) // session invalidated by logoutSuccessHandler.

还有 myLogutSuccessHandler() :

public class MyLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler 

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException 

        ....

        // Invalidation of an old session
        HttpSession session = request.getSession(false);
        if (session != null) 
            logger.debug("Invalidating session: " + session.getId());
            session.invalidate();
        

        ...

        super.onLogoutSuccess(request, response, authentication);
    

这让我明白了:如果注销出错,我应该如何使会话无效?

谢谢,

【问题讨论】:

看看这个,如果它适合你 - findnerd.com/list/view/… 您是否使用任何自定义LogoutHandlers? @NatFar 在该代码中没有自定义 LogoutHandlers 【参考方案1】:

来自 Javadoc:

LogoutHandler 实现期望被调用以执行必要的清理,因此不应抛出异常。

所以你的LogoutSuccessHandler 总是会被调用。只要在您实际使会话无效之前(或只要它被捕获)没有在您的 onLogoutSuccess(..) 方法中引发异常,您的代码就会始终运行。

也许onLogoutSuccess()这个方法的名字不是很直观(可能更像afterLogout())。没有LogoutFailureHandler,因为注销会总是成功,所以LogoutSuccessHandleronLogoutSuccess()总是会被调用。

【讨论】:

以上是关于如何在 Spring 中处理不成功的注销?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:注销后如何显示成功消息

Spring security logout - 仅在登录用户触发注销时添加消息

如何使用xml在spring security中禁用注销确认?

您如何在 spring-security 中注销所有已登录的用户?

如何在 Spring Boot WebFlux 中使用 GET 请求注销

如何在 Spring Boot 后端使用 jwt 令牌实现注销功能(使用休息端点)