前端跨域的最经常使用的两种方式

1、使用jQuery的方式作JSONP跨域php

$.ajax({
            url: "http://blog.csdn.net/Api",
            data: "key=word&jsoncallback=?",
            dataType: "jsonp",
            type: "get",
            success: function (data) {
                  //此处是返回的数据
            },
            error: function (e) {
                
            }
        });        

目前jquery库已经全面支持跨域的方式,此方式实际上底层也是经过script标签的方式进行跨域,下面会介绍script标签的方式。html

经过dataType指定jsonp,底层封装后,会在head标签后面追加<script src="http://blog.csdn.net/Api?key=word&jsoncallback=funcName"></script>前端

全部的jsonP都是这个原理,借助script标签的跨域特性来实现,funcName再jquery中是自动生成的,后台会获取jsoncallback参数,获取对应的函数名称,最后包装成想要的格式,好比最后输出结果是:funcName({"result":"suc","code":"1000"}),那么再Jquery中,会将该方法直接指定给success方法,最后来接收返回的数据。jquery

2、使用CORS跨域ajax

要使用CORS,咱们须要了解前端和服务器端的使用方法。json

        一、  前端小程序

        之前咱们使用Ajax,代码相似于以下的方式:微信小程序

   

var xhr = new XMLHttpRequest();  
xhr.open("GET", "/api", true);  
xhr.send();  

   这里的“/hfahe”是本域的相对路径。api

        若是咱们要使用CORS,相关Ajax代码可能以下所示:跨域

var xhr = new XMLHttpRequest();  
xhr.open("GET", "http://blog.csdn.net/api", true);  
xhr.send();  

    请注意,代码与以前的区别就在于相对路径换成了其余域的绝对路径,也就是你要跨域访问的接口地址。

        咱们还必须提供浏览器回退功能检测和支持,避免浏览器不支持的状况。

function createCORSRequest(method, url) {  
  var xhr = new XMLHttpRequest();  
  if ("withCredentials" in xhr) {  
    // 此时即支持CORS的状况  
    // 检查XMLHttpRequest对象是否有“withCredentials”属性  
    // “withCredentials”仅存在于XMLHTTPRequest2对象里  
    xhr.open(method, url, true);  
   
  } else if (typeof!= "undefined") {  
   
    // 不然检查是否支持XDomainRequest,IE8和IE9支持  
    // XDomainRequest仅存在于IE中,是IE用于支持CORS请求的方式  
    xhr = new XDomainRequest();  
    xhr.open(method, url);  
   
  } else {  
   
    // 不然,浏览器不支持CORS  
    xhr = null;  
   
  }  
  return xhr;  
}  
   
var xhr = createCORSRequest('GET', url);  
if (!xhr) {  
  throw new Error('CORS not supported');  
}  

如今若是直接使用上面的脚本进行请求,会看到浏览器里控制台的报错以下:

错误显示的很明显,这是由于咱们还未设置Access-Control-Allow-Origin头。

二、  服务器

        服务器端对于CORS的支持,主要就是经过设置Access-Control-Allow-Origin来进行的。若是浏览器检测到相应的设置,就能够容许Ajax进行跨域的访问。

        HTTP 头的设置方法有不少,http://enable-cors.org/这篇文章里对各类服务器和语言的设置都有详细的介绍,下面咱们主要介绍Apache和PHP里的设置方法。

        Apache:Apache须要使用mod_headers模块来激活HTTP头的设置,它默认是激活的。你只须要在Apache配置文件的<Directory>, <Location>, <Files>或<VirtualHost>的配置里加入如下内容便可:

  1. Header set Access-Control-Allow-Origin *  

  PHP:只须要使用以下的代码设置便可。

  1. <?php  
  2.  header("Access-Control-Allow-Origin:*");  

以上的配置的含义是容许任何域发起的请求均可以获取当前服务器的数据。固然,这样有很大的危险性,恶意站点可能经过XSS攻击咱们的服务器。因此咱们应该尽可能有针对性的对限制安全的来源,例以下面的设置使得只有http://blog.csdn.net这个域才能跨域访问服务器的API。

Access-Control-Allow-Origin: http://blog.csdn.net  

 

近期刚上线一门基于微信小程序、公众号和小程序云开发的微信受权、分享和支付的专项课程,若是你对支付感兴趣能够考虑入手:

https://coding.imooc.com/class/343.html

React全家桶开发通用的后台管理系统:

https://coding.imooc.com/class/236.html

Vue2.0+Vue-Router+Vuex+Node+Mongo开发全栈商城课程

https://coding.imooc.com/class/113.html

慕课讲师:河畔一角

讲师地址:http://www.imooc.com/u/1343480

相关文章
相关标签/搜索