如何在 Spring 引导中为 /favicon.ico 设置 Strict-Transport-Security Header
How To Set Strict-Transport-Security Header for /favicon.ico in Spring Boot
我的 Spring 引导应用程序(v1.4.2,带有 undertow 启动器)当前正在为其服务的每个资源设置 Strict-Transport-Security header,包括 API 资源来自我的 spring-web RestControllers,以及 /src/main/resources/static
中的静态资源。我发现的 只有 例外是 /favicon.ico
。此文件中缺失的 header 触发了我们的安全扫描结果,我想清除它们。
这是我到目前为止尝试过的方法:
- 禁用 Spring 的 custom favicon handling 和
spring.mvc.favicon.enabled=false
为 HttpSecurity 配置中的所有资源添加了 explicit header handling:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http.headers()
.httpStrictTransportSecurity()
.requestMatcher(request -> true);
}
}
似乎无论我做什么,此资源都会生成一组与 Spring Boot.例如,/favicon.ico
.
中没有应用于我所有其他响应的缓存控制 header
有趣的是,我发现 header 我能够影响此文件的是 Content-Type header(默认行为 returns Content-Type: application/octet-stream
) 通过将 MimeMapping 添加到 EmbeddedServletContainerCustomizer:
@Configuration
public class WebConfigurer implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
mappings.add("ico", "image/x-icon");
container.setMimeMappings(mappings);
}
}
SpringBootWebSecurityConfiguration 有一个默认的忽略路径列表,这些路径被添加到 servlet 堆栈中的第一个安全过滤器之一:
private static List<String> DEFAULT_IGNORED = Arrays.asList(
"/css/**",
"/js/**",
"/images/**",
"/webjars/**",
"/**/favicon.ico");
您可以通过在 SecurityProperties bean 上设置 "ignored" 列表来覆盖此忽略路径列表。
@Bean
public SecurityProperties securityProperties() {
SecurityProperties props = new SecurityProperties();
props.setIgnored(Arrays.asList("none"));
return props;
}
将 null 或空列表传递到 setIgnored()
会产生默认行为,因此我添加了关键字 "none" 以指示我不想忽略任何路径。 SpringBootWebSecurityConfiguration 在构建 "ignores" 过滤器之前从列表中删除 "none"。
我的 Spring 引导应用程序(v1.4.2,带有 undertow 启动器)当前正在为其服务的每个资源设置 Strict-Transport-Security header,包括 API 资源来自我的 spring-web RestControllers,以及 /src/main/resources/static
中的静态资源。我发现的 只有 例外是 /favicon.ico
。此文件中缺失的 header 触发了我们的安全扫描结果,我想清除它们。
这是我到目前为止尝试过的方法:
- 禁用 Spring 的 custom favicon handling 和
spring.mvc.favicon.enabled=false
为 HttpSecurity 配置中的所有资源添加了 explicit header handling:
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) { http.headers() .httpStrictTransportSecurity() .requestMatcher(request -> true); } }
似乎无论我做什么,此资源都会生成一组与 Spring Boot.例如,/favicon.ico
.
有趣的是,我发现 header 我能够影响此文件的是 Content-Type header(默认行为 returns Content-Type: application/octet-stream
) 通过将 MimeMapping 添加到 EmbeddedServletContainerCustomizer:
@Configuration
public class WebConfigurer implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
mappings.add("ico", "image/x-icon");
container.setMimeMappings(mappings);
}
}
SpringBootWebSecurityConfiguration 有一个默认的忽略路径列表,这些路径被添加到 servlet 堆栈中的第一个安全过滤器之一:
private static List<String> DEFAULT_IGNORED = Arrays.asList(
"/css/**",
"/js/**",
"/images/**",
"/webjars/**",
"/**/favicon.ico");
您可以通过在 SecurityProperties bean 上设置 "ignored" 列表来覆盖此忽略路径列表。
@Bean
public SecurityProperties securityProperties() {
SecurityProperties props = new SecurityProperties();
props.setIgnored(Arrays.asList("none"));
return props;
}
将 null 或空列表传递到 setIgnored()
会产生默认行为,因此我添加了关键字 "none" 以指示我不想忽略任何路径。 SpringBootWebSecurityConfiguration 在构建 "ignores" 过滤器之前从列表中删除 "none"。