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);
}
posted @ 2020-09-15 11:48  lee2guang  阅读(611)  评论(0编辑  收藏  举报