spring-securiy配置中defaultSuccessU
2021-09-13 本文已影响0人
virtual灬zzZ
在SecurityConfig类中设置如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
....
// 登录成功跳转
.defaultSuccessUrl("/main",true)
....
}
上面是通过defaultSuccessUrl方法设置认证成功后跳转的路径,那其实也可以通过successForwardUrl这个方法设置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
....
// 登录成功跳转
.successForwardUrl("/main")
....
}
那么他们有什么区别?其中的一个区别有时候也会是一个坑。
successForwardUrl
如果说我们用了successForwardUrl,并且在controller中如下返回页面,那么就会报错了。
@RequestMapping("/main")
public String toMain(){
return "main.html";
}
登录成功跳转出现异常:There was an unexpected error (type=Method Not Allowed, status=405).:
提示该请求方式不支持,我们知道登录的请求是post方式,但是我们看输出toMain方法是执行了的,这里有个要注意的是springmvc不支持post请求直接返回页面,successForwardUrl是转发过来的,所以还是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);
}
那其实第一个里面还是调用了带两个参数的,那么第二个boolean类型参数到底有何作用。如果说我们配置的时候使用第一个方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
....
// 登录成功跳转
.defaultSuccessUrl("/main")
....
}
那么这个时候会出现个问题,假如我们还没有登录认证,在浏览器输入一个不存在的url,例如localhost:8080/test,那通过此前的配置security会帮我们导向登录页面,然后当我们登录成功后你会发现跳转的路径变成了/test,而不是设置的/main。
使用第二个方法,并且第二参数置为true,那么就不会出现上面问题,会直接转到/main。