Spring 5.3.23静态JS文件MIME类型异常:返回application/octet-stream
解决Spring 5.3.23升级后静态JS文件MIME类型错误问题
问题分析
升级Spring到5.3.23后,带哈希后缀的JS文件(如app.cfd50411dd32f43695e2.bundle.js)被识别为application/octet-stream类型,Chrome的严格MIME检查会拒绝执行这类脚本。这是因为Spring 5.3.x对静态资源的MIME类型解析逻辑做了调整,默认规则无法正确匹配带哈希前缀的JS文件名,导致 fallback 到默认的二进制流类型。
解决方案
1. 手动配置MIME类型映射
通过实现WebMvcConfigurer接口,强制指定JS文件的Content-Type:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { // 方式一:配置内容协商的MIME映射 @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.mediaType("js", MediaType.APPLICATION_JAVASCRIPT); } // 方式二:在资源处理链中指定MIME类型 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .resourceChain(true) .addResolver(new PathResourceResolver() { @Override protected MediaType getMediaType(Resource resource) throws IOException { String filename = resource.getFilename(); if (filename != null && filename.endsWith(".js")) { return MediaType.APPLICATION_JAVASCRIPT; } return super.getMediaType(resource); } }); } }
2. 自定义MIME类型配置文件
在项目的src/main/resources下创建mime.types文件,添加:
application/javascript js
然后通过Servlet上下文初始化器加载这个配置:
@Bean public ServletContextInitializer mimeTypesInitializer() { return servletContext -> servletContext.setMimeType("js", "application/javascript"); }
3. 排查拦截器/过滤器干扰
检查项目中是否存在自定义的Filter或Interceptor,确认它们没有修改静态资源响应的Content-Type头,避免覆盖Spring设置的正确MIME类型。
内容的提问来源于stack exchange,提问作者simar
相关产品推荐
相关产品推荐

