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; } }
项目结构与截图
项目结构

控制台日志截图

浏览器错误截图

问题原因与修复方案
核心原因
- 登录路径冲突:
loginProcessingUrl与登录页的GET请求路径均为/swadeshiBank/v1/login,导致Spring Security处理登录提交时,与控制器的GET请求触发循环调用。 - 根路径无正确映射:访问
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
相关产品推荐
相关产品推荐

