Spring Boot集成Thymeleaf时JS文件MIME为application/json被拦截如何解决
触发原因
- 核心原因是
/js/admin-register-users.js的请求实际没有返回JS文件内容,而是返回了JSON格式的响应(通常是业务错误、鉴权失败或404的统一JSON返回体),所以浏览器识别到MIME类型和预期的text/javascript不符,加上X-Content-Type-Options: nosniff响应头禁止浏览器自动嗅探类型,直接拦截了资源加载。 - 常见的具体触发场景:
- 静态资源路径配置有误,或者
classpath:/static/js/目录下不存在对应的js文件,Spring Boot解析不到资源后返回了JSON格式的错误响应 - 存在路径为
/js/**的Controller接口,接口优先级高于静态资源处理器,请求直接被接口处理返回JSON - 接入了Spring Security等鉴权组件,静态资源请求被拦截后返回了JSON格式的鉴权失败响应
- 全局配置了消息转换器,强制所有响应的Content-Type被覆盖为
application/json,篡改了静态资源的响应头
- 静态资源路径配置有误,或者
修复方案
- 第一步先验证请求响应内容
直接在浏览器地址栏访问https://localhost:8090/js/admin-register-users.js,查看返回内容:如果是JSON格式的错误提示,就可以按照上面的场景逐一排查。 - 优化静态资源配置
删除多余的资源映射规则,简化配置如下:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/img/**", "/css/**", "/js/**") .addResourceLocations("classpath:/static/img/", "classpath:/static/css/", "classpath:/static/js/") .setCachePeriod(3600) .resourceChain(true); } }
- 排查路径冲突
检查所有Controller的@RequestMapping配置,确认没有和/js/**路径重复的接口定义。 - 排查鉴权规则(如使用Spring Security)
给静态资源路径添加放行规则,示例如下:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/js/**", "/css/**", "/img/**", "/resources/**"); } }
- 排查全局消息转换器配置
如果配置了全局Jackson消息转换器强制覆盖响应类型,调整转换器的匹配规则,排除静态资源路径的响应处理,或提升静态资源MediaType处理器的优先级。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

