我正在使用Thymeleaf和Spring Boot开发一个简单的登录表单。当我尝试在Chrome中访问以下网址时:“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";
        }

有人知道为什么会这样吗?

最佳答案

您的 Controller 会捕获并重定向到相同的URL:

@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都将:
  • 由于您的.loginPage("/login")中的SecurityConfig而重定向到/log
  • 然后使用@RequestMapping(value="/login"捕获的
  • 然后使用/login重定向到"redirect:/login"
  • 然后
  • 重新捕获并随意重定向。
  • 关于spring-boot - Spring Boot重定向过多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39310634/

    10-14 09:55