如何从Spring MVC访问Angular4页面?解决NotFound报错问题
问题分析与解决方案
你的问题主要出在Spring MVC的静态资源映射配置和单页应用(SPA)的路由回退处理上,结合你的项目结构与代码配置,我梳理了关键错误点和修复方案:
1. WEB-INF目录的访问限制问题
你把Angular打包文件放在/WEB-INF/monitoringFront下,但WEB-INF是服务器受保护的目录,浏览器无法直接访问其中的静态资源(比如runtime.js、main.js);同时原配置里的InternalResourceViewResolver也没有正确指向Angular的index.html。
2. 缺少静态资源映射规则
Spring MVC默认不会自动映射WEB-INF下的静态文件,必须手动配置资源映射,让Spring能正确找到Angular打包后的JS、CSS等文件。
3. SPA路由回退处理缺失
Angular是客户端路由系统,当用户直接访问根路径/或/dashboard时,Spring MVC需要把这些请求转发到index.html,交给Angular路由处理,否则会触发服务器端的404错误。
修复后的WebMvcConfig配置
替换你原来的配置类代码:
@Configuration @EnableWebMvc @ComponentScan(basePackages = { "ge.mvc"}) public class WebMvcConfig implements WebMvcConfigurer { // 配置静态资源映射,允许Spring访问Angular打包文件 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("/WEB-INF/monitoringFront/"); } // 配置SPA路由回退,所有非API请求转发到index.html @Override public void addViewControllers(ViewControllerRegistry registry) { // 根路径直接转发到index.html registry.addViewController("/") .setViewName("forward:/index.html"); // 匹配所有Angular路由,统一转发到index.html registry.addViewController("/**") .setViewName("forward:/index.html"); } // 移除原有的InternalResourceViewResolver,因为不需要JSTL视图,直接转发到Angular入口文件 }
额外检查项
- 确认Angular打包后的
index.html和runtime.js、main.js等文件确实在/WEB-INF/monitoringFront目录下; - 修改
index.html中的<base href="./">为<base href="/springMvcApp/">,适配你的项目上下文路径,避免资源加载路径错误; - 确保Spring MVC的DispatcherServlet映射路径为
/(web.xml或Java配置中),让所有请求都能经过DispatcherServlet处理。
完成以上修改后,访问http://localhost:8080/springMvcApp/时,Spring会转发到index.html,Angular路由系统会自动加载LoginComponent,同时静态资源也能正常加载,404问题应该就能解决了。
内容的提问来源于stack exchange,提问作者user8368945
相关产品推荐
相关产品推荐

