SpringSecurity5-教程2-登出源码分析

使用demo学习,其实在之前教程中,在FilterChainProxy中看到过LogoutFilter,这个就是默认的登出Filter;

源码分析

首先浏览器访问http://localhost:8035/,输入用户名root和密码root完成登录;然后在FilterChainProxy打断点如下:

SpringSecurity5-教程2-登出源码分析_第1张图片

然后浏览器访问http://localhost:8035/logout ,进入断点:

可看到LogoutFilter,放开断点,直到进入LogoutFilter:

SpringSecurity5-教程2-登出源码分析_第2张图片

进入requiresLogout方法:

可以看到只要是/logout请求,均判断为登出请求;debug放行到执行登出方法,进入logout方法:

可以看到有两个handler,分别是SecurityContextLogoutHandler和LogoutSuccessEventPublishingLogoutHandler,

进入SecurityContextLogoutHandler:

LogoutSuccessEventPublishingLogoutHandler就是发送一个登出成功的事件,供用户自定义订阅方法;

debug放行进入onLogoutSuccess方法:

SpringSecurity5-教程2-登出源码分析_第3张图片

可知默认重定向到/login?logout

debug放行,可知执行return方法,不会后续的Filter:

SpringSecurity5-教程2-登出源码分析_第4张图片

取消所有断点,页面渲染:

SpringSecurity5-教程2-登出源码分析_第5张图片

经验总结

总结可知,登出最重要的就是session置为无效并清理认证结果,即SecurityContextLogoutHandler,如果想自定义登出接口,可以实现为:

Java
@RequestMapping(value = "/myLogout")
public void logout(HttpServletRequest request, HttpServletResponse response, String redirect_uri) throws IOException {
    new SecurityContextLogoutHandler().logout(request, null, null);
    if (redirect_uri.isEmpty()) {
        response.sendRedirect("/");
        return;
    }
    response.sendRedirect(redirect_uri);
}

你可能感兴趣的:(spring-security,java,spring)