.
目录
一、问题
二、方案
三、代码
四、总结
一、问题
在Springboot做系统的页面嵌入的时候,报错如下:
Refused to display ‘http://xxx.com/#/aa/bb’ in a frame because it set ‘X-Frame-Options’ to ‘sameorigin’.
出现这个报错的原因是因为:要添加 X-frame-options 响应头设置
二、方案
要添加 X-frame-options ,赋值的方法有如下三种:
(1)DENY:不能被嵌入到任何iframe或frame中。
(2)SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。
(3)ALLOW-FROM uri:只能被嵌入到指定域名的框架中。
防止某些重要网页被其他网站框架导入,可以给页面增加X-Frame-Options响应头,这样浏览器会依据X-Frame-Options的值来控制iframe框架的页面是否允许加载显示出来,IE下的效果如下(此内容无法再框架中显示。为了帮助保护在此网站中输入的信息安全,此内容的发行者不允许在框架中显示该信息),其他非IE核心浏览器会显示空白内容。
三、代码
那么在 springboot 项目中,该如何设置那访问的方法呐 ?具体做法如下:
@EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { //设置X-Frame-Options 响应头,可以嵌套ifram中去. http.headers() .frameOptions() .disable(); /* 以SAMEORIGIN 方式嵌入,其他两种类似如此 http.headers() .frameOptions() .sameOrigin() .httpStrictTransportSecurity() .disable(); */ } }
在 SpringMVC 中,可以实现如下:
class FrameTao implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader(“x-frame-options”, “SAMEORIGIN”);
chain.doFilter(request, response);
}
}
四、总结
目前用到的解决办法:
1、配置apache
(如果是在本地的话,就是在httpd.conf里面配置;如果是linux(ubuntu的话)就是在apache2.conf里面),找个空的位置加入这行代码,具体看你是选择哪种
<span style="font-size:14px;">Header always append X-Frame-Options SAMEORIGIN</span>
有可能会遇到一种情况,就是我在服务端配置完apache之后,尝试 Restart Apache 但是报了一个错误:
Invalid command ‘Header’, perhaps misspelled or defined by a module not included in the server configuration
header的方法模块没有安装,我们需要先自行安装一下:
先输入 a2enmod heade ,然后需要重启一下Apache,输入service apache2 restart
2、配置Nginx:
配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置中:
<span style="font-size:14px;">add_header X-Frame-Options SAMEORIGIN;</span>
3、在服务端设置的方式如下:
Java代码:
response.addHeader(“x-frame-options”,”SAMEORIGIN”);
其他解决方案,可以google查看!