【发布时间】:2020-07-20 15:21:51
【问题描述】:
我必须在我的 spring MVC 项目中启用X-Frame-Options: SAMEORIGIN,才能将此参数返回到 http 响应标头。
项目部署在 Apache Tomcat 9 上。
这是我的网络安全配置
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers().frameOptions().sameOrigin();
}
}
这就是我初始化调度程序 servlet 的方式
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{AppConfig.class, WebSecurityConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
在 spring 安全文档 (https://docs.spring.io/spring-security/site/docs/5.3.1.RELEASE/reference/html5/#headers) 中提到
Spring Security 提供了一组默认的安全相关 HTTP 响应标头以提供安全的默认值。
但是,我在响应头中看不到任何安全头,似乎我的项目中没有启用spring security。
如果我在 @Controller 类方法中手动添加标题选项,它会起作用
@Controller
public class WController {
@GetMapping("/hello")
public String sayHello(HttpServletResponse response, Model model) {
response.setHeader("X-Frame-Options", "SAMEORIGIN");
return "htmlPageTemplate";
}
}
请检查,我做错了什么。 如何正确修复和启用网络安全?
【问题讨论】:
-
因为你没有正确配置东西。您已配置安全部分,但未配置 Web 集成。它需要注册一个过滤器。见docs.spring.io/spring-security/site/docs/current/reference/…
-
感谢@M.Deinum 成功了。
标签: java spring web spring-security x-frame-options