Spring Boot 3.1.1配置contextPath后根路径重定向404问题求助
解决方案
当配置server.servlet.contextPath=/my-service后,Spring Boot应用的所有请求路径都会以/my-service为前缀,而你要处理的localhost:8080是服务器根路径,不属于应用的contextPath范围,因此之前的WebMvcConfigurer配置只能处理应用内部的路径(如/my-service/),无法拦截服务器根路径的请求,导致404错误。
以下是几种可行的解决方法:
方法一:通过Tomcat内置配置实现两步重定向
这种方式无需编写自定义代码,仅需配置文件和少量MVC配置:
- 修改
application.properties,添加Tomcat根路径重定向配置:
server.servlet.contextPath=/my-service # 开启服务器根路径到应用contextPath的重定向 server.tomcat.redirect-root-to-context-path=true
- 修改你的
WebMVCApplicationConfig,配置应用内部根路径到/info的重定向:
@Configuration public class WebMVCApplicationConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // 匹配应用内部的根路径(即/my-service/),重定向到/my-service/info registry.addRedirectViewController("/", "/info"); } }
此时访问localhost:8080会先被Tomcat重定向到localhost:8080/my-service,再由Spring MVC重定向到localhost:8080/my-service/info。
方法二:自定义Filter直接拦截服务器根路径
如果需要一步完成重定向(避免两次跳转),可以编写自定义Filter拦截服务器根路径的请求:
import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class RootRedirectFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; // 拦截服务器根路径请求 if ("/".equals(req.getRequestURI())) { // 直接重定向到目标路径 res.sendRedirect("/my-service/info"); return; } chain.doFilter(request, response); } }
添加这个Filter后,访问localhost:8080会直接跳转到localhost:8080/my-service/info,无需额外配置server.tomcat.redirect-root-to-context-path。
方法三:配置Tomcat欢迎页面实现重定向
通过自定义Tomcat容器配置,修改默认欢迎页面的行为:
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; @Component public class TomcatRootRedirectCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { factory.addContextCustomizers(context -> { // 设置欢迎页面为重定向到目标路径 context.addWelcomeFile("redirect:/my-service/info"); }); } }
这种方式利用Tomcat的欢迎页面机制,当访问服务器根路径时,自动触发重定向到目标地址。
内容的提问来源于stack exchange,提问作者Deba
相关产品推荐
相关产品推荐

