问题描述
- Tomcat升级后项目css文件样式不起作用;
- 网络请求中css文件请求头Content-Type:text/html;
- SpringMVC项目css文件样式不起作用;
背景
为了方便查看Redis缓存的数据,公司在服务器上部署了开源的treenms项目,开始部署在Tomcat7中间件上一切正常,后来由于公司安全要求,需要对Tomcat进行升级,于是公司人员将Tomcat升级到Tomcat8,并将treenms项目文件拷贝到新的Tomcat的webapps目录下面,然后启动,这时候发现项目可以正常启动,浏览器也可以对项目进行访问,但是发现css样式显示异常,行内样式都正常,就css文件的样式却没效果,但是直接请求css文件发现可以正常加载。
运行环境
- 中间件:apache-tomcat-9.0.44
- 项目技术:treenms使用的技术是SpringMVC
排查过程
-
既然是css文件内的样式加载异常,首先想到就是请求路径异常或者是否被SpringMVC给拦截了**【结果正常】**
-
百度搜索,发现网上有说css文件加载时Content-Type:text/html;情况的,于是看了下自己的css文件加载请求。【确实也是有该问题,问题定位成功】
问题分析
出现css文件Content-Type:text/html,我知道两种情况。
- 项目中的Filter对css文件做了过滤,并且设置了Content-Type
response.setContentType("text/html;charset=utf-8");
- 项目中使用SpringMVC框架,并且spring-mvc.xml有如下配置
<!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL-->
<mvc:default-servlet-handler/>
解决方案
-
方案一: 删除Filter中的
response.setContentType("text/html;charset=utf-8");
-
方案二: 使用
<mvc:resources location="/static/" mapping="/static/**" />
替换<mvc:default-servlet-handler/>
-
方案三: 如果没有使用
<mvc:default-servlet-handler/>
,也没发现Filter设置response.setContentType("text/html;charset=utf-8");
,那就可以自己定义Filter去修改Content-Type
public class MineTypeFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String uri = request.getRequestURI();
response.setCharacterEncoding("utf-8");
chain.doFilter(request,response);
//Filter后置阶段查看css文件的ContentType,如果被替换成text/html
if(uri.contains(".css")) {
System.out.println("结束请求URI:"+uri+"\t Content-Type:"+response.getContentType());
//如果Content-Type有问题就进行修改
if(response.getContentType()!=null && response.getContentType().contains("text/html")) {
response.setContentType("text/html;charset=utf-8");
}
}
}
}