Spring Boot 太多重定向

问题描述 投票:0回答:2

我正在使用 Thymeleaf 和 Spring Boot 开发一个简单的登录表单。当我尝试在 Chrome 中点击以下 URL:“http://localhost:8080/login”时,我收到一条错误消息“ERR_TOO_MANY_REDIRECTS”。我尝试清除浏览器中的缓存和 cookie,但仍然遇到相同的错误。

我尝试通过将以下属性放入我的 application.properties 中来禁用默认安全登录屏幕:

security.basic.enabled=false

并将以下配置添加到我的 SecurityConfig 中,以便除“/login”和“/resources”之外的任何 URL 都将获得身份验证:

@Configuration 
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired 
    private UserRepository userRepository;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
        .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .permitAll();
    }

我的 LoginController 很简单:

@Controller
public class LoginController {

        @RequestMapping(value="/login", method=RequestMethod.GET)
        public String loadForm(Model model) {
            model.addAttribute("user", new User());
            return "redirect:/login";
        }

有人知道为什么会发生这种情况吗?

spring-boot
2个回答
8
投票

您的控制器捕获并重定向到相同的网址:

@RequestMapping(value="/login", method=RequestMethod.GET)
    public String loadForm(Model model) {
        model.addAttribute("user", new User());
        return "redirect:/login";
    }

此外,您的 SecurityConfig 定义了以下内容:

@Configuration 
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
    ...
    .loginPage("/login")
}

.loginPage()
的 javadoc 是这样说的:

需要身份验证时重定向到的登录页面

因此,发出的任何安全请求或直接访问 /login 都会:

  • 重定向至 /login,因为您的
    .loginPage("/login")
     中有 
    SecurityConfig
  • 然后你用
    @RequestMapping(value="/login"
  • 抓住它
  • 然后使用
    /login
     重定向到 
    "redirect:/login"
  • 然后重新捕捉并随意重定向。

0
投票

您的控制器在循环中工作,不使用重定向作为回报,只写文件名作为回报我已经更正了您的代码

公共类LoginController {

    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String loadForm(Model model) {

        model.addAttribute("user", new User());
        return "login";
    }

}

当您必须将控制权传递给其他控制器处理程序时使用重定向

© www.soinside.com 2019 - 2024. All rights reserved.