国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前端跨域資源請求: JSONP/CORS/反向代理

番茄西紅柿 / 2220人閱讀

摘要:此時完成的跨域代理配置僅僅是在開發環境下生效,到了生產環境下如果是放到服務器上則還需要借助的反向代理來進行跨域的代理。

跨域 指的是瀏覽器不能執行其他網站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對 JavaScript 施加的安全限制。

同源就是指 域名,協議,端口 均相同。兩個網域若 域名、協議、端口 任一不同則二者的通信就出現了跨域問題,前端的跨域問題普通存在于兩個階段,一個是開發環境調試階段,另一個發布上線后的生產環境運行階段,一般生產環境下的跨域問題會由運維或實施人員來解決,但是開發環境下的跨域問題需要前端或后端進行處理。


常見的跨域解決方案

1.jsonp 跨域

jsonp 是數據格式 JSON 的一種“使用模式”,可以讓網頁從別的網站索要數據,jsonp 的原理就是利用 <script> 標簽沒有跨域限制,通過 <script> 標簽 src 屬性,發送帶有 callback 參數的 GET 請求,服務端將接口返回數據拼湊到 callback 函數中,返回給瀏覽器,瀏覽器解析執行,從而前端拿到 callback 函數返回的數據。

注:用 JSONP 抓到的數據并不是 JSON,而是任意的 JavaScript ,用 JavaScript 解釋器運行而不是用 JSON 解析器解析。所以通過 Chrome 查看所有 JSONP 發送的 Get 請求都是 js 類型,而非 XHR 。


下面演示下使用原生 JS 和 Ajax 實現 jsonp 跨域的寫法:


①原生 JS 寫法:


     <script>

        // 回調執行函數

        function handleCallback(res) {

            console.log(res);  // {user: 'admin', callback: 'handleCallback'}

        }

     </script>

     <script type="text/javascript" src="http://127.0.0.1:8080/login?user=admin&callback=handleCallback"></script>

②Ajax 寫法:


        $.ajax({

            // 需要跨域獲取數據的網站 URL

            url: 'http://127.0.0.1:8080/login?user=admin',

            // 請求類型,JSONP 只支持 GET 請求,可以不寫,默認也是 GET 類型

            method: 'GET',

            // 使用 $.ajax() 發起 JSONP 請求,必須指定 dataType: 'jsonp'

            dataType: 'JSONP',

            // jsonpCallback 用于設置回調函數的函數名稱

            jsonpCallback: 'handleCallback',

            // success 用于接收請求成功后的返回值

            success: function (res) {

                console.log(res);

            }

        })

應用場景:有些第三方數據接口可能會使用 jsonp 解決跨域,在實際工作中并不怎么用這種方式解決跨域問題。主要是因為 jsonp 只支持 GET 請求,請求方式單一不能滿足開發需求,這也是 jsonp 的致命缺點。


2.中間服務器代理

注:跨域問題只存在于瀏覽器中,服務器端沒有跨域的概念。中間服務器代理的思路就是我們前端可以不跨域的去訪問一個中間服務器(這個中間服務器和我們前端網域的 域名、協議、端口都相同,則不跨域),再讓中間服務器去替我們訪問這個我們本來需要跨域訪問的網站,中間服務器拿到我們需要的資源然后再返還給我們即可。


這主要是一種解決跨域的思路,下面我們會介紹到在 Vue 項目中配置 反向代理 來解決跨域問題時其實就是使用的這種中間服務器代理的思路。


3.CORS 跨域資源共享

 CORS 是一個 W3C 標準,全稱是"跨域資源共享"。它允許瀏覽器向跨源服務器,發出 XMLHttpRequest 請求,從而克服了 AJAX 只能同源使用的限制。

CORS 需要瀏覽器和服務器同時支持。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。


瀏覽器將 CORS 請求分為簡單請求和非簡單請求。對于簡單請求,瀏覽器直接發出 CORS 請求,具體來說就是在頭信息中,增加一個 Origin 字段。服務器會根據這個字段決定是否同意此次請求。而非簡單請求就是對服務器有特殊要求的請求,比如 PUT 請求、DELETE 請求等,非簡單請求的 CORS 請求,會在正式通信之前,增加一次 HTTP 查詢請求,稱為“預檢請求”(preflight),預檢請求的請求類型是 OPTIONS 表示詢問,服務器會先對預檢請求進行回應,如果允許了此次的跨域才會發起正式的非簡單請求,所以非簡單請求實際上會有兩次請求記錄(一次預檢請求一次正式請求)。


簡單來說實現 CORS 跨域資源共享其實就是在發起請求前或在服務器端進行請求頭、請求類型等配置,符合配置項條件的請求就可以正常與該服務器進行通信。


簡單請求中重要配置字段如下:


Access-Control-Allow-Origin 是必須的配置項,它的值要么是請求時 Origin 字段的值(包含:協議、域名、端口),要么是一個 * ,表示接受任意域名的請求。


Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials 該字段可選。它的值是一個布爾值,表示是否允許發送 Cookie 。默認情況下,Cookie不包括在CORS請求之中。設為 true ,即表示服務器明確許可,Cookie 可以包含在請求中,一起發給服務器。這個值也只能設為 true ,如果服務器不要瀏覽器發送 Cookie ,刪除該字段即可。

Access-Control-Allow-Credentials: true

Access-Control-Expose-Headers 該字段可選。CORS請求時,XMLHttpRequest 對象的getResponseHeade() 方法只能拿到6個基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必須在 Access-Control-Expose-Headers 里面指定。


Access-Control-Expose-Headers: FooBar

非簡單請求的配置:


非簡單請求除了需要配置 Origin 字段外,一般還需要配置如下字段:


 Access-Control-Allow-Methods 該字段是必須的,用來列出瀏覽器的 CORS 請求會用到哪些HTTP方法。如 PUT 、DELETE 等


Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Request-Headers 該字段是一個逗號分隔的字符串,指定瀏覽器CORS請求會額外發送的頭信息字段。


Access-Control-Request-Headers: X-Custom-Header

CORS 跨域資源共享可以在前端或后端進行配置,是目前常用的解決瀏覽器跨域的方案,較之 jsonp 其更加強大,幾乎支持所有的請求類型。


4.配置反向代理實現跨域的方法

配置反向代理 是前端自行在項目中進行配置來解決跨域的一種方式,主要就是在項目中設置代理,開啟代理就會在本地創建一個虛擬服務器,我們會通過它來發送請求,它也會把請求返回的數據返還給我們。主要就是使用中間服務器代理的思路。


在 Vue 項目中配置反向代理:(分為 CLI 2.X 和 CLI 3.X 搭建的項目)


CLI 2.X 搭建的項目配置路徑:打開項目的 config/index.js 文件,找到 dev 中的 proxyTable: {}, 字段,(如果沒有就添加一個),將該字段進行如下配置:


        // 設置代理

        proxyTable: {

            // 需要代理的接口,當地址中有 /api 時就會觸發代理機制

            '/api': {

                target: 'http://39.97.33.178', // 目標服務器域名

                    ws: true,  // 是否啟用 websockets,就開啟即可

                        changeOrigin: true, // 是否跨域,需要設置此值為 true 才可以讓本地服務器代理我們發出請求

                            pathRewrite: { // 路徑重寫

                    '^/api': ''             //重定向,即服務器端是否需要將匹配到的值替換成其他值來進行數據請求,假設我們想把 localhost:8888/api/login 變成 http://39.97.33.178/login 就需要這么做

                }

            }

        },

CLI 3.X 搭建的項目默認的配置文件是隱藏的,需要手動在根目錄創建一個 vue.config.js 文件,在該文件中 進行如下配置:


        // 設置代理

        modele.exports = {

            devServer: {

                // 設置代理

                proxy: {

                    // 需要代理的接口,當地址中有 /api 時就會觸發代理機制

                    '/api': {

                        target: 'http://39.97.33.178', // 目標服務器域名

                        ws: true,  // 是否啟用 websockets,就開啟即可

                        changeOrigin: true,  // 是否跨域,需要設置此值為 true 才可以讓本地服務器代理我們發出請求

                        pathRewrite: {

                            '^/api': ''  // 重定向,即服務器端是否需要將匹配到的值替換成其他值來進行數據請求,假設我們想把 localhost:8888/api/login 變成 http://39.97.33.178/login 就需要這么做

                        }

                    }

                },

            }

        }

注意:vue.config.js 的改動如果需要生效,需要進行重啟服務。

此時完成的跨域代理配置僅僅是在開發環境下生效,到了生產環境下如果是放到 Nginx 服務器上則還需要借助 Nginx 的反向代理來進行跨域的代理。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/989.html

相關文章

  • 004. 前端跨域資源請求JSONP/CORS/反向代理

    摘要:同源策略瀏覽器的一個安全功能,不同源的客戶端腳本在沒有明確授權的情況下,不能讀寫對方資源。不受同源策略限制的跨域資源的引入是允許的頁面中的鏈接,重定向以及表單提交是不會受到同源策略限制的。1.什么是跨域資源請求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果兩個頁面的協議,端口(如果有指定)和域名都相同,則兩個頁面具有相...

    番茄西紅柿 評論0 收藏0
  • jsonp跨域獲取數據實現百度搜索

    摘要:同源策略做了很嚴格的限制,但是在實際的場景中,又確實有很多地方需要突破同源策略的限制,也就是我們常說的跨域。使用跨域由于同源策略,一般來說位于的網頁無法與不是的服務器溝通,而的元素是一個例外。 本菜雞最近在寫某個頁面請求數據時,報了如下的錯誤。 Failed to load https://...:No Access-Control-Allow-Origin header is pre...

    Tikitoo 評論0 收藏0
  • jsonp跨域獲取數據實現百度搜索

    摘要:同源策略做了很嚴格的限制,但是在實際的場景中,又確實有很多地方需要突破同源策略的限制,也就是我們常說的跨域。使用跨域由于同源策略,一般來說位于的網頁無法與不是的服務器溝通,而的元素是一個例外。 本菜雞最近在寫某個頁面請求數據時,報了如下的錯誤。 Failed to load https://...:No Access-Control-Allow-Origin header is pre...

    gggggggbong 評論0 收藏0
  • jsonp跨域獲取數據實現百度搜索

    摘要:同源策略做了很嚴格的限制,但是在實際的場景中,又確實有很多地方需要突破同源策略的限制,也就是我們常說的跨域。使用跨域由于同源策略,一般來說位于的網頁無法與不是的服務器溝通,而的元素是一個例外。 本菜雞最近在寫某個頁面請求數據時,報了如下的錯誤。 Failed to load https://...:No Access-Control-Allow-Origin header is pre...

    lemanli 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<