Spring安全多个注销网址?

时间:2015-08-07 14:49:55

标签: spring-security

我正在使用Spring安全性java配置,我想知道一种实现多个网址注销的方法。即。

logout().logoutRequestMatcher(new 
AntPathRequestMatcher("/invalidate")).logoutUrl("/logout");

在此代码中,正常的注销网址“/ logout”工作正常并且是一个帖子请求,但我也希望用户注销网址“/ invalidate”,这似乎不起作用。

2 个答案:

答案 0 :(得分:1)

根据Spring Security教程,似乎接下来是更优雅的方法:

enter image description here

在security form-login标签中,只需添加如下内容:

<security:logout logout-url="/logout" success-handler-ref="logoutHandler"/>

每次您点击/退出网址时,都会调用logoutHandler,并在其上,您可以决定注销成功后的行为方式。

来自Spring docs:

enter image description here

您需要做的就是创建一个新类,实现图像中标记的接口并实现其单一方法。

在该方法上决定如何在成功注销后采取行动。例如:

@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;
  }
}