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

Spring Security重定向过多及首页跳转异常问题求助

Spring Security + JSP 重定向循环与默认首页配置问题排查

问题描述

开发Spring Boot Web应用(基于Spring Security、JSP视图)时出现以下问题:

  • 访问配置permitAll()的首页、登录页时,浏览器提示**"重定向次数过多"**,控制台无输出;添加日志后发现控制器方法被重复调用。
  • 当前访问http://localhost:8080会自动跳转到登录页,需求是默认进入http://localhost:8080/swadeshiBank/v1/首页,仅点击登录按钮时才跳转登录页。

相关配置与代码

JSP配置(application.properties)

server.error.path=/error 
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

PageController 代码

@Controller
@RequestMapping(value = "/swadeshiBank/v1")
public class PageController {

    public static final Logger logger = LogManager.getLogger(PageController.class);


    private static final String loginPage = "login";


    @GetMapping(value = "/")
    public String homePage(){
        logger.info("Request Came to home :");
        return "home";
    }

    @GetMapping(value = "/login")
    public String getLoginPage(){
        logger.info("Request Came to login :");
        return loginPage;
    }

}

SecurityConfig 代码

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/swadeshiBank/v1/", "/swadeshiBank/v1/login").permitAll() // Public pages
                .requestMatchers("/swadeshiBank/v1/account-details").authenticated() // Authenticated users
                .requestMatchers("/swadeshiBank/v1/admin").hasRole("ADMIN") // Admin users
                .requestMatchers("/swadeshiBank/v1/management").hasRole("MANAGER") // Manager users
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/swadeshiBank/v1/login")
                .loginProcessingUrl("/swadeshiBank/v1/login") // URL to submit the login form
                .defaultSuccessUrl("/swadeshiBank/v1/account-details", true)
                .permitAll()
            )
            .logout(logout -> logout
                .logoutRequestMatcher(new AntPathRequestMatcher("/swadeshiBank/v1/logout"))
                .logoutSuccessUrl("/swadeshiBank/v1/login?logout")
                .invalidateHttpSession(true)
                .permitAll()
            );

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("user")
                .password("{noop}password")
                .roles("USER")
                .build());
        manager.createUser(User.withUsername("admin")
                .password("{noop}admin")
                .roles("ADMIN")
                .build());
        manager.createUser(User.withUsername("manager")
                .password("{noop}manager")
                .roles("MANAGER")
                .build());
        return manager;
    }
}

项目结构与截图

项目结构

项目结构

控制台日志截图

控制台截图

浏览器错误截图

浏览器错误截图

问题原因与修复方案

核心原因

  1. 登录路径冲突:loginProcessingUrl与登录页的GET请求路径均为/swadeshiBank/v1/login,导致Spring Security处理登录提交时,与控制器的GET请求触发循环调用。
  2. 根路径无正确映射:访问http://localhost:8080时,无对应控制器处理,Spring Security将未认证请求重定向到登录页,加剧循环。

修复步骤

1. 分离登录页与登录提交路径

修改SecurityConfig中的loginProcessingUrl为独立POST路径,避免与登录页GET请求冲突:

.formLogin(form -> form
    .loginPage("/swadeshiBank/v1/login")
    .loginProcessingUrl("/swadeshiBank/v1/login-submit") // 改为专属提交路径
    .defaultSuccessUrl("/swadeshiBank/v1/account-details", true)
    .permitAll()
)

同步修改login.jsp中的表单action:

<form action="/swadeshiBank/v1/login-submit" method="post">
    <!-- 用户名、密码输入框 -->
    <button type="submit">登录</button>
</form>

2. 配置根路径跳转至首页

添加根路径的控制器映射,确保访问http://localhost:8080自动跳转到目标首页:

// 新建根路径控制器
@Controller
public class RootController {
    @GetMapping("/")
    public String redirectToHome() {
        return "redirect:/swadeshiBank/v1/";
    }
}

或在SecurityConfig中通过视图控制器配置:

http
    // 原有配置...
    .viewControllerRegistry(registry -> registry
        .addViewController("/")
        .setViewName("redirect:/swadeshiBank/v1/")
    );

3. 完善静态资源权限(若有)

若项目包含静态资源(CSS/JS/图片等),需添加匿名访问规则,避免拦截导致的间接循环:

.authorizeHttpRequests(authorize -> authorize
    .requestMatchers("/css/**", "/js/**", "/images/**").permitAll()
    .requestMatchers("/", "/swadeshiBank/v1/", "/swadeshiBank/v1/login").permitAll()
    // 其他权限规则...
)

验证效果

重启应用后:

  • 访问http://localhost:8080自动跳转至http://localhost:8080/swadeshiBank/v1/首页
  • 点击登录按钮才进入登录页,提交登录无循环问题
  • 首页、登录页均可正常访问,无重定向错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:37:06