Spring Boot 3访问URL重定向至JSP实际路径引发404问题
Spring Boot 3 JSP重定向404问题排查与解决
问题场景
开发Spring Boot 3应用时遇到以下异常:
- 未登录状态下访问
localhost:8080/event,会被重定向至JSP实际路径localhost:8080/WEB-INF/jsp/eventDetailPage.jsp?continue,返回404状态码; - 调试确认控制器的
getEvent()方法已执行完成; - 已在
WebSecurityConfig中为/event路径设置白名单,登录状态下访问该路径正常; - 此前使用Spring Boot 1/2版本无此问题,推测与Spring Boot 3版本变更相关。
用户提供代码与配置
控制器代码
@Controller public class EventController { @GetMapping(path = "/event") public ModelAndView getEvent(Model model) { return new ModelAndView("eventDetailPage"); } }
pom.xml依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> </dependencies>
application.properties配置
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
问题分析
核心原因集中在Spring Boot 3(对应Spring Security 6)的安全规则变更与依赖配置适配问题:
- Spring Security 6 Filter链逻辑变更:未登录时,内部转发至JSP的请求被错误判定为需认证的外部请求,触发重定向;
- JSP解析器依赖范围错误:
tomcat-embed-jasper设为provided,导致开发环境下内嵌Tomcat无法加载JSP解析能力; - JSTL依赖不完整:仅引入API接口,缺少实现类可能引发视图解析异常。
解决方案
1. 修正Spring Security白名单配置
采用Spring Security 6的链式配置语法,确保/event及内部转发路径被正确放行:
@Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) // 根据实际需求开启或关闭CSRF .authorizeHttpRequests(auth -> auth .requestMatchers("/event").permitAll() // 放行目标接口 .requestMatchers("/WEB-INF/jsp/**").permitAll() // 放行JSP内部转发路径 .anyRequest().authenticated() // 其他路径需认证 ) .formLogin(form -> form // 配置登录页(按需调整) .loginPage("/login") .permitAll() ); return http.build(); } }
2. 调整JSP解析器依赖范围
将tomcat-embed-jasper的scope改为compile,确保开发环境下内嵌Tomcat能加载JSP解析器:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>compile</scope> </dependency>
3. 补充JSTL实现依赖
添加JSTL实现类,完善JSP标签支持:
<dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>3.0.1</version> </dependency>
验证
重启应用后,未登录状态下访问localhost:8080/event,应正常渲染JSP页面,无重定向及404问题;登录状态下访问保持正常。
内容的提问来源于stack exchange,提问作者Felix Schildmann
相关产品推荐
相关产品推荐

