You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security 6.0集成自定义登录页出现过多重定向问题求助

问题分析与解决方案

你的自定义登录页出现过多重定向的核心原因有两个:

1. 登录请求映射冲突

LoginController中使用@RequestMapping("/login")处理登录页面,该注解默认匹配所有HTTP请求方法(GET、POST等),而Spring Security的loginProcessingUrl("/login")也会处理POST请求的登录提交。两者同时处理POST /login请求,导致逻辑冲突,触发循环重定向。

2. 注册错误返回路径异常

注册表单验证失败时,你返回了"/registration"(带斜杠的绝对路径),这可能导致视图解析器路径解析异常,间接引发重定向问题。


修复步骤

步骤1:限定登录页面的请求方法

将LoginController中的@RequestMapping("/login")修改为@GetMapping("/login"),让它只处理GET请求(用于展示登录页面),POST请求完全交给Spring Security处理:

@Controller
public class LoginController {
    @Autowired
    private UserService userService;

    // 仅处理GET请求,展示登录页
    @GetMapping("/login")
    public String loginForm() {
        System.out.println(1);
        return "login";
    }

    // ... 其他代码保持不变
}

步骤2:修正注册错误返回的路径

将注册方法中验证失败时的返回路径从"/registration"改为"registration"(去掉开头的斜杠,使用相对路径):

@PostMapping("/registration")
public String registration(
        @Valid @ModelAttribute("user") UserDto userDto,
        BindingResult result,
        Model model) {
    User existingUser = userService.findByEmail(userDto.getEmail());

    if (existingUser != null)
        result.rejectValue("email", null,
                "User already registered !!!");

    if (result.hasErrors()) {
        model.addAttribute("user", userDto);
        // 使用相对路径返回注册页
        return "registration";
    }

    userService.save(userDto);
    return "redirect:/registration?success";
}

步骤3:(可选)优化SecurityConfig的路径匹配

可以将SecurityConfig中的路径匹配更明确,避免不必要的模糊匹配:

@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
    http.csrf().disable()
            .authorizeHttpRequests((requests) -> requests
                    // 明确允许注册相关请求
                    .requestMatchers("/registration", "/registration?success").permitAll()
                    // 允许登录页面访问
                    .requestMatchers("/login").permitAll()
                    .requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                    .requestMatchers("/admin/**").hasAnyRole("ADMIN")
                    .anyRequest().authenticated()
            )
            .formLogin((form) -> form
                    .loginPage("/login").permitAll()
                    .loginProcessingUrl("/login")
                    .defaultSuccessUrl("/user/")
            )
            .logout((logout) -> logout.permitAll())
            .exceptionHandling().accessDeniedPage("/access-denied");
    return http.build();
}

完成以上修改后重启项目,登录页的重定向问题即可解决。

内容的提问来源于stack exchange,提问作者suyoung07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:39