浏览器的同源策略 导致了跨域问题
 
同源策略 限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。
 
 
 同源 
   
   如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源
 
      
  
下表给出了相对http://store.company.com/dir/page.html同源检测的示例:
 
 
跨域问题需要服务端与客户端相同配合完成,单方面并不能解决问题。
 
 
 使用 nodejs 搭建服务端,监听 8080 端口  
  
const  http =  require ( "http" ) ; 
const  url =  require ( "url" ) ; 
const  querystring =  require ( "querystring" ) ; 
const  server =  http. createServer ( ) ; 
server
  . on ( "request" ,  function ( req,  res)  { 
    let  urlPath =  url. parse ( req. url) . pathname; 
    
    res. writeHead ( 200 ,  {  "Content-Type" :  "application/json"  } ) ; 
    let  data =  { 
      name:  "Hello World" 
    } ; 
    if  ( urlPath ===  "/jsonp" )  { 
      if  ( req. url. split ( "?" ) . length >=  2 )  { 
        let  qs =  querystring. parse ( req. url. split ( "?" ) [ 1 ] ) ; 
        
        let  callback =  qs. callback +  "("  +  JSON . stringify ( data)  +  ");" ; 
        res. end ( callback) ; 
      }  else  { 
        data. name =  "noCallbackFunction" ; 
      } 
    } 
    res. end ( JSON . stringify ( data) ) ; 
  } ) 
  
  . listen ( "8080" ,  ( )  =>  { 
    
    console. log ( "Server running! listen 8080" ) ; 
  } ) ; 
这样,我们需要的服务器搭建好了,在前端请求后加入’/jsonp?callback=functionName’,就将其认定为 JSONP 请求,且 callback 后带入一个 js 中已有的全局方法。
 
 
< ! DOCTYPE  html> 
< html lang= "en" > 
< head> 
    < meta charset= "UTF-8" > 
    < title> Document< / title> 
< / head> 
< body> 
    < script> 
        function  testJSONP ( data) { 
            console. log ( data) ; 
        } 
    < / script> 
    < script src= "http://127.0.0.1:8080/jsonp?callback=testJSONP" > < / script> 
< / body> 
< / html> 
在浏览器控制台输出返回结果
 
使用 jquery 直接跨源访问,会产生错误
 
< script> 
  $ ( function ( ) 
  { $. get ( "http://127.0.0.1:8080/jsonp" ,  function ( data)  { 
    console. log ( data) ; 
  } ) } 
  ) ; 
< / script> 
产生的错误如下:
 
 
<!DOCTYPE html> 
< htmllang = " en" > < head> < metacharset = " UTF-8" /> < title> </ title> < scriptsrc = " https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js" > </ script> </ head> < body> < divng-app = " myApp" ng-controller = " myCtrl" > </ div> < script>  var  app =  angular. module ( "myApp" ,  [ ] ) ;  var  gitApi =  "https://api.github.com?callback=JSON_CALLBACK" ;   app. controller ( "myCtrl" ,  function ( $scope,  $http)  {  $http ( {  method:  "JSONP" ,  url:  gitApi } ) . then (  function ( response)  {   console. log ( "success"  +  JSON . stringify ( response. data) ) ;  $scope. name =  response. data;  } ,  function ( response)  {   console. log ( response) ;  }  ) ;  } ) ;   </ script> </ body> </ html> CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。
 
CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。
 
 
 Access-Control-Allow-Originres. writeHead ( 200 ,  {  "Content-Type" :  "application/json"  , "Access-Control-Allow-Origin" : "*" } ) ; 
  
 Access-Control-Allow-Credentials  
 Access-Control-Expose-HeadersXMLHttpRequest 对象的 getResponseHeader()方法只能拿到 6 个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在 Access-Control-Expose-Headers 里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回 FooBar 字段的值。