在SecurityConfig類中設(shè)置如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
....
// 登錄成功跳轉(zhuǎn)
.defaultSuccessUrl("/main",true)
....
}
上面是通過defaultSuccessUrl方法設(shè)置認(rèn)證成功后跳轉(zhuǎn)的路徑,那其實也可以通過successForwardUrl這個方法設(shè)置:
@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,
有兩種解決方式:
- controller中最后在重定向一下,就可以解決問題了:
@RequestMapping("/main")
public String toMain(Authentication authentication){
return "redirect:/main.html";
}
- 改為@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)個問題,假如我們還沒有登錄認(rèn)證驱富,在瀏覽器輸入一個不存在的url,例如localhost:8080/test褐鸥,那通過此前的配置security會幫我們導(dǎo)向登錄頁面,然后當(dāng)我們登錄成功后你會發(fā)現(xiàn)跳轉(zhuǎn)的路徑變成了/test叫榕,而不是設(shè)置的/main浑侥。
使用第二個方法晰绎,并且第二參數(shù)置為true,那么就不會出現(xiàn)上面問題荞下,會直接轉(zhuǎn)到/main。