2016-02-23 57 views
1

我試圖實現spring logoutSuccessHandler。 當用戶註銷,我重定向調用TargetURL中,狀態302,這裏是我的代碼來實現這一點:Spring LogoutHandler:使用302狀態的sendRedirect

public class LogoutHandler extends SimpleUrlLogoutSuccessHandler { 

public LogoutHandler(AuthenticationContext context) { 
    this.context = context; 
} 

@Override 
protected void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) 
     throws IOException, ServletException { 
    String targetUrl = "mytarget"; 

    authentication.setAuthenticated(false); 
    response.setStatus(HttpServletResponse.SC_FOUND); 

    response.setHeader("Location", targetUrl); 
    response.setContentType(MediaType.TEXT_PLAIN_VALUE); 
    response.getWriter().write(targetUrl); 
    response.getWriter().flush(); 
    response.getWriter().close(); 

} 

} 

但是這個代碼不工作,我已經取消了狀態爲此/註銷web服務。 我們如何實現lougoutHandler?

+0

爲什麼?什麼是默認不做?如果你想要一個不同的策略,實現一個自定義的'RedirectStrategy'並注入它,而不是擴展'SimpleUrlLogoutSuccessHandler'並通過完全覆蓋它的實現來禁用它。 –

回答

0

你可以使用Spring啓動指定註銷成功網址,如下所示: -

protected void configure(HttpSecurity http) throws Exception { 
     http.formLogin() 
      .defaultSuccessUrl(<Successful Login>) 
       .failureUrl(<Unsuccessful Login>) 
      .and() 
      .logout() 
       .logoutSuccessUrl(<Your Success Logout URL >) 
      ; 

     http.csrf().disable(); 
     http.headers().cacheControl(); 
     http.headers().contentTypeOptions().disable(); 
     http.addFilterBefore(crosFilter, ChannelProcessingFilter.class); 
    } 
+0

我想將我的成功註銷重定向到外部URL,例如www.google.com。我用這個代碼http.logout().. logoutSuccessUrl(<您的成功註銷URL>),但它不起作用。和thi瀏覽器我已經取消了我的註銷電話 –

1

您可以實現自定義LogoutSuccessHandler

static class RedirectLogoutSuccessHandler implements LogoutSuccessHandler { 

    private String logoutUrl; 
    private int statusCode; 

    public RedirectLogoutSuccessHandler(String logoutUrl, int statusCode) { 
     this.logoutUrl = logoutUrl; 
     this.statusCode = statusCode; 
    } 

    @Override 
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, 
           Authentication authentication) throws IOException, ServletException { 
     response.setStatus(statusCode); 
     response.setHeader("Location", logoutUrl); 
    } 
} 

而且使用它配置:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .logout() 
      .logoutSuccessHandler(new RedirectLogoutSuccessHandler("http://www.google.com", HttpServletResponse.SC_MOVED_TEMPORARILY)); 
} 

或者像@ M.Deinum建議使用SimpleUrlLogoutSuccessHandler並注入定製RedirectStrategy

static class CustomRedirectStrategy implements RedirectStrategy { 

    @Override 
    public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException { 
     response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); 
     response.setHeader("Location", url); 
    } 
} 

,並配置它:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    SimpleUrlLogoutSuccessHandler logoutSuccessHandler = new SimpleUrlLogoutSuccessHandler(); 
    logoutSuccessHandler.setDefaultTargetUrl("http://www.google.com"); 
    logoutSuccessHandler.setRedirectStrategy(new CustomRedirectStrategy()); 
    //... 
    http 
     .logout() 
      .logoutSuccessHandler(logoutSuccessHandler); 
} 
+0

的狀態,當我嘗試使用第一種方法時,註銷未被重定向到targetUrl(www.google.com),並且在瀏覽器中出現此錯誤:XMLHttpRequest無法加載https://www.google .COM /。請求的資源上沒有'Access-Control-Allow-Origin'標頭 –

+0

因此,您是從XMLHttpRequest上下文啓動註銷? 上述兩種實現在使用get/post(而不是從ajax上下文)啓動時都工作。 – fateddy

+0

在我的情況下,我發起在ajax上下文中註銷/註銷 –