cors 跨域

使用场景

后端服务和前端服务不在同一台主机,且前后端通过接口形式传送数据。

eg:前端资源存在CDN上(awp项目),这样前后端无法公用一台服务主机,需要借助 CORS来解决跨域问题。

配置项

前端

和普通的ajax请求,没有太多区别。如果需要携带cookie,angularjs的可以这样配置,其他配置方式自行google

.config([ '$httpProvider' , function ($httpProvider) {
     $httpProvider.defaults.withCredentials =  true ;
}])

后端

CORS 更多的是需要后端支持,后端再返回数据时,需要设置 header。

public  void  doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)  throws  IOException, ServletException {
         HttpServletRequest request = (HttpServletRequest) servletRequest;
         String origin = request.getHeader( "Origin" );
         HttpServletResponse response = (HttpServletResponse) servletResponse;
         response.setHeader( "Access-Control-Allow-Origin" , origin);
         response.setHeader( "Access-Control-Allow-Credentials" "true" );
         response.setHeader( "Access-Control-Allow-Methods" "POST, GET, PUT, PATCH, DELETE, OPTIONS" );
         response.setHeader( "Access-Control-Allow-Headers" "Origin, Content-Type, Accept, __skcy, x-requested-with" );
         response.setHeader( "Access-Control-Max-Age" "1728000" );
         if  (!request.getMethod().equalsIgnoreCase( "options" )) {
             filterChain.doFilter(servletRequest, servletResponse);  //过滤OPTIONS请求
         }
     }

Preflighted Requests

Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的(GET 请求不会发送), 触发预检请求之后,这时候当后端配置的  Access-Control-Allow-Methods 属性中没有包含OPTIONS类型的请求,浏览器发送的OPTIONS试探请求没有被接受,请求就终止了。

OPTIONS 请求不会携带 cookie,如果需要根据cokie进行认证判断,需要对 OPTIONS 进行过滤。

if  (!request.getMethod().equalsIgnoreCase( "options" )) {
      filterChain.doFilter(servletRequest, servletResponse);  //过滤OPTIONS请求
}

缓存 OPTIONS

cors post 请求,一般会发两个请求,第一个请求是 OPTIONS,就是上面提到的预检请求,预检请求通过才会真正的发送POST请求

为了减少预检请求的次数,需要设置OPTIONS缓存时间,在规定的时间,不用再次发送 OPTIONS 请求。

response.setHeader( "Access-Control-Max-Age" "1728000" );
随后的 POST 请求,在设置的缓存时间内,不会重复发 OPTIONS,检索HTTP请求数据。

CORS 请求成功

document.domain

前后端资源所在的服务器的根域名一样,可以通过设置document.domain来实现跨越请求。

document.domain = 'meituan.com'

其他方案

  1. jsonp
  2. nginx、node 转发
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值