从您的问题中,我看到您正在尝试创建自己的注销,并且还尝试使用默认的Spring注销。我建议您仅选择一种方法,不要将二者混合使用。我可以通过两种方法向您显示从Spring注销:
第一:默认的spring安全性注销
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/logout.done").deletecookies("JSESSIONID").invalidateHttpSession(true)从上面的示例中,您只需要
/logout在注销用户时调用url。无需创建任何程序
@Controller来处理该注销,而是spring将有助于注销用户。您还可以在此处添加其他要失效的内容。
第二:以编程方式注销
@RequestMapping(value = {"/logout"}, method = RequestMethod.POST)public String logoutDo(HttpServletRequest request,HttpServletResponse response){HttpSession session= request.getSession(false); SecurityContextHolder.clearContext(); session= request.getSession(false); if(session != null) { session.invalidate(); } for(cookie cookie : request.getcookies()) { cookie.setMaxAge(0); } return "logout";}如果您正在使用此注销,则无需在spring安全配置中包括第一种方法。通过使用此方法,您可以添加完成注销之前和之后的额外操作。顺便说一句,要使用此注销,只需调用
/logouturl即可手动注销用户。此方法将使会话无效,清除spring安全上下文和cookie。
除第二种方法外,如果您使用
RequestMethod.POST,则还需要包含csrf密钥作为帖子。另一种方法是使用隐藏的输入csrf键创建表单。这是使用jquery自动生成的注销链接的一些示例:
$("#Logout").click(function(){ $form=$("<form>").attr({"action":"${pageContext.request.contextPath}"+"/logout","method":"post"}) .append($("<input>").attr({"type":"hidden","name":"${_csrf.parameterName}","value":"${_csrf.token}"})) $("#Logout").append($form); $form.submit();});您只需要创建超链接
<a id="Logout">Logout</a>即可使用它。
如果您使用
RequestMethod.GET,只需在链接中添加一个csrf键作为参数,如下所示:
<a href="${pageContext.request.contextPath}/logout?${_csrf.parameterName}=${_csrf.token}">Logout</a>仅此而已,请其帮助。



