跨域造成原因和解決方法


1.跨域指?

跨域是指瀏覽器的不執行其他網站腳本的,由於瀏覽器的同源策略造成,是對JavaScript的一種安全限制

說白點理解,當你通過瀏覽器向其他服務器發送請求時,不是服務器不響應,而是服務器返回的結果被瀏覽器限制了。

 

同源策略的同源

同源指的是協議、域名、端口 都要保持一致

http://www.123.com:8080/index.html (http協議,www.123.com 域名、8080 端口 ,只要這三個有一項不一樣的都是跨域,這里不一一舉例子)

http://www.123.com:8080/matsh.html(不跨域)

http://www.123.com:8081/matsh.html(端口不一樣,跨域)

注意:localhost 和127.0.0.1 雖然都指向本機,但也屬於跨域。

 

2.跨域的解決方案

>JSONP方式,只支持GET請求,不支持POST請求。

>反向代理,ngixn

> 配置瀏覽器(我配置了谷歌,屬性->目標> 在后面追加 --args --disable-web-security --user-data-dir  注意有個空格)。設置成功打開瀏覽器是出現已欄提示證明已成功配置。

>vue 項目跨域配置

Vue-cli 創建的項目,可以直接利用 Node.js 代理服務器,通過修改vue proxyTable接口實現跨域請求

proxyTable: {  
    '/api': {  //代理地址  
        target: 'http://10.1.0.34:8000/',  //需要代理的地址  
        changeOrigin: true,  //是否跨域  
        secure: false,    
        pathRewrite: {  
            '^/api': '/'   //本身的接口地址沒有 '/api' 這種通用前綴,所以要rewrite,如果本身有則去掉  
        }
    }
}

api指的就是target的地址

參數proxyTable詳解:

  vue-cli的config文件里的參數:proxyTable,這個參數主要是一個地址映射表,你可以通過設置將復雜的url簡化,例如我們要請求的地址是api.xxxxxxxx.com/list/1,可以按照如下設置:

proxyTable: {
  '/list': {
    target: 'http://api.xxxxxxxx.com',
    pathRewrite: {
      '^/list': '/list'
    }
  }
}

這樣我們在寫url的時候,只用寫成/list/1就可以代表api.xxxxxxxx.com/list/1.

這樣實現跨域的原理是利用本地虛擬的服務器,代接受發送請求

 

 參考詳細鏈接  https://www.cnblogs.com/goloving/p/8901189.html

 

> 后台配置請求head

header('Access-Control-Allow-Origin:*');//允許所有來源訪問

header('Access-Control-Allow-Method:POST,GET');//允許訪問的方式

《完結》

 

《后續補充》==========================================================================》 最近研究node 遇到跨域的例子,下面補充點  (node服務器執行)

1.jsonp實現跨域的方式,了解,反正也不會用到了  吧

  缺點: get請求,前后端都要修改

  優點:無兼容問題(js哪個瀏覽器不兼容 站出來)

  思路:利用js保存全局變量來傳遞數據,因為js不受同源策略控制,script標簽加載機制

html

    

 

 

 

js 獲取變量,解析數據

    

 

 

2. cors方式

分類:簡單請求和預檢請求(非簡單請求)

 

 原理:如圖

ajax請求結果被瀏覽器截胡了,cors就是紅色箭頭,告訴瀏覽器這是我要的,別管閑事,然后就可以拿到數據了【笑吧笑吧 表達也就這樣了】

    

 

對於跨源AJAX請求是簡單請求,瀏覽器就自動在頭信息之中,添加一個Origin字段。

GET /cors HTTP/1.1 
Origin: http://m.xin.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

這個orgin我們可以指定的,如果訪問的域不是指定范圍或者沒有指定origin都會報錯跨域問題。

譬如:Access-Control-Allow-Origin:'localhost:5000'// * 表示所有域都可以

其他的

    

 

 

 跨域報錯示例

    

 

 

 

 

解決方式

1. api請求baseulr指向服務器(我這里http指定端口4000)

     

 

 

 

2. Cors設置跨域允許

 js文件中設置

 

     

 

 

 

 

結果(請求url指向也是4000端口了)

    

 

 

 

 

 

這里有個不錯文章解析了cors的原理https://www.cnblogs.com/qiujianmei/p/11649905.html

 

 

 3. cookie、預檢請求、代理服務器proxy解決

................

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM