Resource interpreted as Stylesheet but transferred with MIME type text/html前端报错
问题
系统升级tomcat版本,从原有的8.0.36版本升级到9.0.37版本。
升级后发现,前端中资源文件返回时,content-type被错误的设置为text/html,从而导致css、js、png等无法加载。
解决
解决问题思路
系统中只会在filter中设置content-type。本系统中会拦截静态资源的filter有:CharacterEncodingFilter、XSSFilter、DefaultServlet。其中DefaultServlet时tomcat默认配置的,另外两个是自己业务代码中的。
调试tomcat源码,查看content-type在哪个filter中被设置为text/html。
各filter调用顺序CharacterEncodingFilter、XSSFilter、DefaultServlet。
当tomcat版本是9.0.37时,在CharacterEncodingFilter之后,content-type即被设置为text/html,且再没有被更改过。
而当tomcat版本是8.0.36时,在CharacterEncodingFilter之后,content-type即被设置为text/html,最后在DefaultServlet中会再被设置为相应的content-type。
原因
tomcat版本是8.0.36时,DefaultServlet.java中代码如下,会把
if (contentType != null) {
if (debug > 0)
log("DefaultServlet.serveFile: contentType='" +
contentType + "'");
response.setContentType(contentType);
}
作者:lee2guang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.