spring-securiy配置中defaultSuccessUrl與successForwardUrl區(qū)別

在SecurityConfig類中設置如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            ....
            // 登錄成功跳轉(zhuǎn)
            .defaultSuccessUrl("/main",true)
           ....
}

上面是通過defaultSuccessUrl方法設置認證成功后跳轉(zhuǎn)的路徑,那其實也可以通過successForwardUrl這個方法設置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            ....
            // 登錄成功跳轉(zhuǎn)
            .successForwardUrl("/main")
           ....
}

那么他們有什么區(qū)別?其中的一個區(qū)別有時候也會是一個坑。

successForwardUrl

如果說我們用了successForwardUrl,并且在controller中如下返回頁面,那么就會報錯了。

 @RequestMapping("/main")
 public String toMain(){ 
     return "main.html";
 }

登錄成功跳轉(zhuǎn)出現(xiàn)異常:There was an unexpected error (type=Method Not Allowed, status=405).:


提示該請求方式不支持,我們知道登錄的請求是post方式,但是我們看輸出toMain方法是執(zhí)行了的,這里有個要注意的是springmvc不支持post請求直接返回頁面,successForwardUrl是轉(zhuǎn)發(fā)過來的,所以還是post請求,這里就報錯了。所以如果要是用successForwardUrl,

有兩種解決方式:

  1. controller中最后在重定向一下,就可以解決問題了:
 @RequestMapping("/main")
 public String toMain(Authentication authentication){  
     return "redirect:/main.html";
 }
  1. 改為@PostMapping

defaultSuccessUrl

defaultSuccessUrl方法其實有兩個重載的,

public final T defaultSuccessUrl(String defaultSuccessUrl) {
    return defaultSuccessUrl(defaultSuccessUrl, false);
}

public final T defaultSuccessUrl(String defaultSuccessUrl, boolean alwaysUse) {
    SavedRequestAwareAuthenticationSuccessHandler handler = new SavedRequestAwareAuthenticationSuccessHandler();
    handler.setDefaultTargetUrl(defaultSuccessUrl);
    handler.setAlwaysUseDefaultTargetUrl(alwaysUse);
    this.defaultSuccessHandler = handler;
    return successHandler(handler);
}

那其實第一個里面還是調(diào)用了帶兩個參數(shù)的,那么第二個boolean類型參數(shù)到底有何作用。如果說我們配置的時候使用第一個方法:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            ....
            // 登錄成功跳轉(zhuǎn)
            .defaultSuccessUrl("/main")
           ....
}

那么這個時候會出現(xiàn)個問題,假如我們還沒有登錄認證,在瀏覽器輸入一個不存在的url,例如localhost:8080/test,那通過此前的配置security會幫我們導向登錄頁面,然后當我們登錄成功后你會發(fā)現(xiàn)跳轉(zhuǎn)的路徑變成了/test,而不是設置的/main。
使用第二個方法,并且第二參數(shù)置為true,那么就不會出現(xiàn)上面問題,會直接轉(zhuǎn)到/main。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容