有时候为了防止网页被别人的网站iframe,我们可以通过在服务端设置HTTP头部中的X-Frame-Options信息。
X-Frame-Options 响应头有三个可选的值:
DENY:页面不能被嵌入到任何iframe或frame中;
SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中;
ALLOW-FROM:页面允许frame或frame加载。
在服务端设置的方式如下:
Java代码:
response.addHeader("x-frame-options","SAMEORIGIN");
Nginx配置:
add_header X-Frame-Options SAMEORIGIN
Apache配置:
Header always append X-Frame-Options SAMEORIGIN
创建一个XFrameOptionsHeaderFilter拦截器
package com.fh.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 针对下述问题,添加HttpServletRequest,HttpServletResponse 拦截
* 问题描述:返回X-Frame-Options或Content- Security-Policy (使用"frame-ancestors"指令) HTTP标头及页面的响应。这防止了在使用帧或iframe HTML标记时页面内容被其他站点渲染。
* @author hxjr_baiyongliang
* @date 2019年5月22日17:55:43
*
*/
public class XFrameOptionsHeaderFilter implements Filter {
String address = "*";//默认的访问地址,目前没有限制地址,* 代替
public XFrameOptionsHeaderFilter() {
}
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//必须
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//实际设置
/*X-Frame-Options 响应头有三个可选的值:
DENY:页面不能被嵌入到任何iframe或frame中;
SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中;
ALLOW-FROM:页面允许frame或frame加载。*/
response.setHeader("x-frame-options", "SAMEORIGIN"); //只允许嵌入本网站页面
response.setHeader("Content-Security-Policy", "default-src https: http: 'unsafe-inline' 'unsafe-eval';connect-src https: http:"); //针对safi和chrome
response.setHeader("Set-Cookie", "cookiename=value;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
chain.doFilter(req, resp);
}
public void destroy() {
}
}
web.xml 加入
XFrameOptionsHeaderFilter
com.fh.filter.XFrameOptionsHeaderFilter
XFrameOptionsHeaderFilter
/*
设置完成
另外:Web 安全之内容安全策略(Content-Security-Policy,CSP)配置问题;详见: https://blog.csdn.net/qq_25623257/article/details/90473859