css 文件未加载,因为在使用 spring security5 时启用了严格的 MIME 检查

css files are not loaded because strict MIME checking is enabled when using spring security5

当内容类型选项为“nosniff”时,

Spring 安全 5 会阻止我的 css 文件。 spring 安全性不会阻止来自其他站点的外部 css 文件或由 struts2 等框架带来的 css 文件,但它会阻止我创建的 css 文件甚至如果文件像这样是空的:

<link type="text/css" rel="stylesheet" href="reclamation/css/style2.css"/> 错误信息是: 拒绝应用 {fileName} 的样式,因为它的 MIME 类型 ('text/html') 不是受支持的样式表 MIME 类型,并且启用了严格的 MIME 检查。 我验证了 css 文件没有错误,但仍然遇到问题。 这是 headers:

Request URL: http://localhost:8080/reclamation/reclamation/js/style2.css Referrer Policy: no-referrer-when-downgrade Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Language: en Content-Length: 1123 Content-Type: text/html;charset=utf-8 Date: Tue, 21 Jul 2020 10:45:08 GMT Expires: 0 Pragma: no-cache X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Accept: text/css,/;q=0.1 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9,fr;q=0.8,ar;q=0.7 Cache-Control: no-cache Connection: keep-alive Cookie: JSESSIONID=EA9A3D0AC31CDB51C68E0806CD5C32E1 DNT: 1 Host: localhost:8080 Pragma: no-cache Referer: http://localhost:8080/reclamation/list-complaint.action Sec-Fetch-Dest: style Sec-Fetch-Mode: no-cors Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36

permitAll 不是解决方案,因为它允许访问但保留安全过滤器

<http pattern="/css/**" security="none"/> 有效,但它会删除 X-Content-Type-Options: css 文件的 nosniff。顺便说一句,security="none" 解决了使用 eclipse 时的问题,但是当我直接在 tomcat9 中部署 war 时,它会被忽略并且 css 文件不会加载.

我的配置:struts2,jdk8 tomcat 9.0.19,spring security 5.1.6.RELEASE

我找到了解决方案,我的过滤器正在将所有文件更改为“text/html”

public class CharacterSetFilter implements Filter {
 
public void destroy() {}

public void doFilter(
  ServletRequest request, 
  ServletResponse response, 
  FilterChain next) throws IOException, ServletException {
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=UTF-8");//this line was the problem
    response.setCharacterEncoding("UTF-8");
    next.doFilter(request, response);
}

// ...

}