Spring Boot中DispatcherServlet返回静态内容时转发至错误URL的问题
Spring Boot多段路径请求转发静态资源404问题解析与解决
问题原因
当Controller返回"page.html"这类相对路径的视图名时,DispatcherServlet会根据当前请求的URL层级拼接转发路径:
- 访问
/a/b时,请求路径的层级根是/a/(去掉最后一段路径后的部分),所以会把视图名拼接到该路径后,生成/a/page.html的查找路径,但你的静态资源page.html实际在根路径/page.html(对应/resources/static/目录),因此出现404。 - 访问
/a时,请求路径的层级根是/,拼接后得到/page.html,刚好匹配静态资源位置,所以能正常访问。
解决方法
方法一:返回绝对路径视图名
直接在返回的视图名前加斜杠/,强制DispatcherServlet从根路径查找静态资源,不受当前请求路径影响。修改后的代码:
@Controller public class HomeController { @GetMapping("/a/b") public String ab(){ System.out.println("Hello"); return "/page.html"; } }
方法二:统一配置视图解析器前缀
如果有大量页面需要处理,可以通过配置视图解析器,给所有返回的视图名自动添加根路径前缀。创建Web配置类:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { // 为视图名添加根路径前缀,后缀留空(因为我们直接返回完整的.html文件名) registry.jsp().prefix("/").suffix(""); } }
配置后,返回"page.html"就会自动解析为"/page.html",同样能正确找到静态资源。
不需要修改DispatcherServlet的核心转发逻辑,这是Spring MVC默认的视图路径解析规则,通过调整视图名格式或配置视图解析器就能轻松解决问题。
内容的提问来源于stack exchange,提问作者Kudor
相关产品推荐
相关产品推荐

