spring security 以及 oauth2

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,

有两种解决方式:

  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);
}

那其实第一个里面还是调用了带两个参数的,那么第二个boolean类型参数到底有何作用。如果说我们配置的时候使用第一个方法:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            ....
            // 登录成功跳转
            .defaultSuccessUrl("/main")
           ....
}

那么这个时候会出现个问题,假如我们还没有登录认证,在浏览器输入一个不存在的url,例如localhost:8080/test,那通过此前的配置security会帮我们导向登录页面,然后当我们登录成功后你会发现跳转的路径变成了/test,而不是设置的/main。
使用第二个方法,并且第二参数置为true,那么就不会出现上面问题,会直接转到/main。

上一篇下一篇

猜你喜欢

热点阅读