注意:Spring 2.x 可能有更好的选择。
在我的情况下 (1.5.x),FilterRegistrationBean 方法没有向错误页面添加额外的标题;因此是另一种选择。
如果您希望将此类标头应用于所有静态内容,包括错误页面和常规静态内容(例如,作为安全审计/漏洞评估的一部分),您可能需要遵循复合方法。
首先,一个简单的实用程序类/方法来保持标题添加统一:
import javax.servlet.http.HttpServletResponse;
public class SecurityUtils {
public static void addHtmlSecurityHeaders(HttpServletResponse response) {
// some example content-security related headers
response.setHeader("X-Content-Type-Options", "nosniff");
response.setHeader("X-Frame-Options", "deny");
}
}
这会将上述标头添加到标准 static/ 资源(this SO answer 提供):
@Bean
public ResourceHttpRequestHandler staticHandler() {
ResourceHttpRequestHandler handler = new ResourceHttpRequestHandler() {
@Override
public void setHeaders(HttpServletResponse response, Resource resource, MediaType mediaType) throws IOException {
SecurityUtils.addHtmlSecurityHeaders(response);
super.setHeaders(response, resource, mediaType);
}
};
handler.setLocations(Collections.singletonList(new ClassPathResource("static/")));
return handler;
}
@Bean
public SimpleUrlHandlerMapping staticMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Integer.MAX_VALUE - 2);
Properties urlProperties = new Properties();
urlProperties.put("/**", "staticHandler");
mapping.setMappings(urlProperties);
return mapping;
}
这会将上述标题添加到错误页面:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptorAdapter() {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
SecurityUtils.addHtmlSecurityHeaders(response);
}
});
}
// .. more overrides
};
}
另外,关于其他方法的一些观察:
- 如果您在 Spring Security 级别应用标头,它们将不会出现在 静态 内容中,例如欢迎页面(基本/索引 HTML)和错误页面。 (除非您以某种方式配置/修改 Spring Security 以包含静态路径 - 这当然是不必要的,并且可能会影响性能)
- 如果您仅使用
ResourceHttpRequestHandler 来注入标头,它们将不会出现安全拦截控制器响应或(更重要的是)错误页面上。
- 在
HandlerInterceptorAdapter 中,我尝试在preHandle() 和afterCompletion() 上配置标题;然而,它们并没有被应用于某些场景——尤其是。用于错误页面。