2017-03-03 68 views
0

我有一個應用程序,我在SuccessfulLoginHandler中有setDefaultTargetUrl('...')春季 - 設置多個網址的最佳方式 - setDefaultTarget

現在我必須實現一個用戶可以登錄查看不同視圖的情況。到目前爲止我所做的是:

@Service 
public class SuccessfulLoginHandler extends SimpleUrlAuthenticationSuccessHandler{ 

    UserService userService; 

    @Autowired 
    public SuccessfulLoginHandler(UserService userService){ 
     this.userService = userService; 
     setDefaultTargetUrl("/app"); 
    } 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
     Authentication authentication) throws IOException, ServletException { 
     User user = AccessService.getUser(authentication); 
     if(this.userService.isFirstLogin(user)){ 
      setDefaultTargetUrl("/firstlogin"); 
     }else{ 
      setDefaultTargetUrl("/app"); 
     } 
     super.onAuthenticationSuccess(request, response, authentication); 
    } 

} 

我不確定這是否是最好的方法。它工作正常,但可能會出現問題,以防2個用戶同時登錄。

什麼是實施「重定向」的正確方法。

+1

解決方案對我來說很好。另外 - 如果2個用戶同時登錄(唯一的共享資源是用戶服務,應該是線程安全的),應該不會有問題。 – fateddy

+0

我認爲你是對的,但我已經將邏輯移到了控制器上,以確保它在那裏我做重定向。 – gon250

回答

-1

成功登錄後,您可以嘗試將用戶重定向到默認網址。

如果您使用Spring Security,您可以簡單地設置成功url或失敗url。

http 
    .authorizeRequests() 
     .anyRequest().authenticated() 
     .and() 
    .formLogin() 
     .loginPage("/login") 
     .failureUrl("/login?login_error=t") 
     .defaultSuccessUrl("/app") 
     .permitAll() 

如果你想成功登錄後設置一些自定義邏輯,你可以做這樣的事情,

public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 

    String queryString = request.getQueryString(); 
    if(queryString == null) { 
     response.setStatus(200); 
    } else if(!queryString.contains("redirectUrl=")) { 
     response.sendRedirect("/"); 
    } else { 
     queryString = URLDecoder.decode(queryString.replace("url=", ""), "utf-8");    
     response.sendRedirect(queryString);    
    } 
} 

附:對於重定向,如果您更喜歡服務器端重定向,則可以使用request.getRequestDispathcer而不是response.sendRedirect。

編輯:併發登錄不應該引起任何問題,因爲userService是一個只讀服務,不應該引發競爭條件問題。