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

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)的安全规则变更与依赖配置适配问题:

  1. Spring Security 6 Filter链逻辑变更:未登录时,内部转发至JSP的请求被错误判定为需认证的外部请求,触发重定向;
  2. JSP解析器依赖范围错误:tomcat-embed-jasper设为provided,导致开发环境下内嵌Tomcat无法加载JSP解析能力;
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:40:28