如何在 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/… 您是否使用任何自定义LogoutHandler
s?
@NatFar 在该代码中没有自定义 LogoutHandlers
【参考方案1】:
来自 Javadoc:
LogoutHandler 实现期望被调用以执行必要的清理,因此不应抛出异常。
所以你的LogoutSuccessHandler
总是会被调用。只要在您实际使会话无效之前(或只要它被捕获)没有在您的 onLogoutSuccess(..)
方法中引发异常,您的代码就会始终运行。
也许onLogoutSuccess()
这个方法的名字不是很直观(可能更像afterLogout()
)。没有LogoutFailureHandler
,因为注销会总是成功,所以LogoutSuccessHandler
的onLogoutSuccess()
总是会被调用。
【讨论】:
以上是关于如何在 Spring 中处理不成功的注销?的主要内容,如果未能解决你的问题,请参考以下文章
Spring security logout - 仅在登录用户触发注销时添加消息
如何使用xml在spring security中禁用注销确认?
您如何在 spring-security 中注销所有已登录的用户?