跨域请求解决方案

什么是跨域?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对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 字段,那么这个首部是必要的。

更多请见:https://developer.mozilla.org/zh-CN/docs/Web/HTTP

猜你喜欢

转载自blog.csdn.net/u013725455/article/details/78294796