什么是跨域?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
跨域的形式:域名不同,协议不同(http,https)
解决方法:
1、前端跨域请求
2、后端处理跨域请求
@PropertySource("classpath:crossdomain.properties")
@Component
@Order(Integer.MIN_VALUE) //控制进入的顺序
public class Crossfilter implements Filter {
@Autowired
private Environment environment;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse)res;
String origin = environment.getProperty("Access-Control-Allow-Origin");
HttpServletRequest request = (HttpServletRequest)req;
if (StringUtils.isEmpty(request.getHeader("Origin"))) {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("*"));
} else if (StringUtils.isEmpty(origin) || "*".equalsIgnoreCase(origin)) {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
} else {
Arrays.stream(origin.split(",")).forEach(domain -> {
if (!StringUtils.isEmpty(domain) && request.getHeader("Origin").contains(domain.replace("*", ""))) {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
}
});
}
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Vary", "Origin");
response.setHeader("Access-Control-Allow-Methods", environment.getProperty("Access-Control-Allow-Methods"));
response.setHeader("Access-Control-Max-Age", environment.getProperty("Access-Control-Max-Age"));
String controlRequestHeaders = request.getHeader("Access-Control-Request-Headers");
if (!StringUtils.isEmpty(controlRequestHeaders)){
response.setHeader("Access-Control-Allow-Headers", controlRequestHeaders);
}
chain.doFilter(req, res);
}
@Override
public void destroy() {
}
}
Access-Control-Max-Age
指定了preflight请求的结果能够被缓存多久,请参考本文在前面提到的preflight例子。
Access-Control-Allow-Credentials
指定了当浏览器的credentials设置为true时是否允许浏览器读取response的内容。当用在对preflight预检测请求的响应中时,它指定了实际的请求是否可以使用credentials。请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。
Access-Control-Allow-Methods
用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。
Access-Control-Request-Headers
用于预检请求。其作用是,将实际请求所携带的首部字段告诉服务器。
Access-Control-Allow-Headers
用于预检请求的响应。其指明了实际请求中允许携带的首部字段。如果请求中含有 Access-Control-Request-Headers 字段,那么这个首部是必要的。