我正在使用Spring安全性java配置,我想知道一种实现多个网址注销的方法。即。
logout().logoutRequestMatcher(new
AntPathRequestMatcher("/invalidate")).logoutUrl("/logout");
在此代码中,正常的注销网址“/ logout”工作正常并且是一个帖子请求,但我也希望用户注销网址“/ invalidate”,这似乎不起作用。
答案 0 :(得分:1)
根据Spring Security教程,似乎接下来是更优雅的方法:
在security form-login标签中,只需添加如下内容:
<security:logout logout-url="/logout" success-handler-ref="logoutHandler"/>
每次您点击/退出网址时,都会调用logoutHandler
,并在其上,您可以决定注销成功后的行为方式。
来自Spring docs:
您需要做的就是创建一个新类,实现图像中标记的接口并实现其单一方法。
在该方法上决定如何在成功注销后采取行动。例如:
@Component("logoutHandler")
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request,HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
if(request.getParameter("msgShow") != null && request.getParameter("msgShow").equals("false")){
redirectResponse(request, response, "http://" + request.getServerName() + ":" + request.getServerPort() + "/my_web_app/home?logout=false");
}
else{
redirectResponse(request, response,"http://" + request.getServerName() + ":" + request.getServerPort() + "/my_web_app/home?logout=true");
}
}
private void redirectResponse(HttpServletRequest request, HttpServletResponse response, String destination) {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", destination);
}
}
现在不要忘记在安全配置文件中添加@Component
注释到上面的注销处理程序+添加接下来的两个语句:
<context:annotation-config />
<context:component-scan base-package="package.to.logout.handler" />
答案 1 :(得分:0)
这可能不是最优雅的方式,但您可以指定一个@Controller,它映射到您要注销的所有URL,例如。克。
@Controller
public class LogoutController {
final String logoutRedirectUrl = "redirect:http://yourredirect.xy";
@RequestMapping("/logout")
public String logout1(HttpServletRequest request) throws ServletException {
request.logout();
return logoutRedirectUrl;
}
@RequestMapping("/second/logout/")
public String logout2(HttpServletRequest request) throws ServletException {
request.logout();
return logoutRedirectUrl;
}
}