前言:隨着工做時間的增加,前面學過的東西開始慢慢遺忘,抽空的時候就將一些資料整理整理,順一順,也看成一種溫習。
我只是前端工匠,防止本身成爲【一斷網就沒法工做的程序員】html
協議類型(protocol)
經過URL能夠指定的主要有如下幾種:http、ftp、gopher、telnet、file等 URL的組成協議 一、protocol(協議):指定使用的傳輸協議,下表列出 protocol 屬性的有效方案名稱。 最經常使用的是HTTP協議,它也是目前WWW中應用最廣的協議。 http —— 超文本傳輸協議訪問該資源。 格式 http:// https —— 用安全套接字層傳送的超文本傳輸協議訪問該資源。 格式 https:// ftp —— 經過 FTP訪問資源。格式 FTP:// mailto —— 電子郵件地址 經過 SMTP 訪問。 格式 mailto: ldap —— 輕型目錄訪問協議搜索 file —— 資源是本地計算機上的文件。格式file:// news —— Usenet新聞組 gopher —— Gopher協議 telnet —— Telnet協議
主機名(hostname)
是指存放資源的服務器的域名系統 (DNS) 主機名或 IP 地址。 有時,在主機名前也能夠包含鏈接到服務器所需的用戶名和密碼(格式:username:password)。
端口號(port)
整數,可選,省略時使用方案的默認端口,各類傳輸協議都有默認的端口號, 如http的默認端口爲80,https的默認端口爲443
路徑及文件名(path)
由零或多個「/」符號隔開的字符串,通常用來表示主機上的一個目錄或文件地址
參數(parameters)
傳遞參數,可有多個參數,用「&」符號隔開,每一個參數的名和值用「=」符號隔開
hash值
#是用來指導瀏覽器動做的,對服務器端徹底無用。因此,HTTP請求中不包括#。 這些字符都不會被髮送到服務器端。 改變#不觸發網頁重載 改變#會改變瀏覽器的訪問歷史 默認狀況下,Google的網絡蜘蛛忽視URL的#部分。 可是,Google還規定,若是你但願Ajax生成的內容被瀏覽引擎讀取, 那麼URL中可使用"#!",Google會自動將其後面的內容轉成查詢字符串_escaped_fragment_的值
若是非同源,共有三種行爲收到限制前端
(1) Cookie、LocalStorage 和 IndexDB 沒法讀取。 (2) DOM 沒法得到。 (3) AJAX 請求不能發送。
Cookie 是服務器寫入瀏覽器的一小段信息,只有同源的網頁才能共享。vue
cookie的組成部分
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE NAME=VALUE NAME是該Cookie的名稱,VALUE是該Cookie的值。 在字符串「NAME=VALUE」中,不含分號、逗號和空格等字符。 Expires=DATE:Expires變量是一個只寫變量,它肯定了Cookie有效終止日期。 該屬性值DATE必須以特定的格式來書寫:星期幾,DD-MM-YY HH:MM:SS GMT, GMT表示這是格林尼治時間。 反之,不以這樣的格式來書寫,系統將沒法識別。 該變量可省,若是缺省時,則Cookie的屬性值不會保存在用戶的硬盤中, 而僅僅保存在內存當中,Cookie文件將隨着瀏覽器的關閉而自動消失。 Domain=DOMAIN-NAME:Domain該變量是一個只寫變量, 它肯定了哪些Internet域中的Web服務器可讀取瀏覽器所存取的Cookie, 即只有來自這個域的頁面纔可使用Cookie中的信息。 這項設置是可選的,若是缺省時,設置Cookie的屬性值爲該Web服務器的域名。 Path=PATH:Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的Cookie。 通常若是用戶輸入的URL中的路徑部分從第一個字符開始包含Path屬性所定義的字符串, 瀏覽器就認爲經過檢查。若是Path屬性的值爲「/」, 則Web服務器上全部的WWW資源都可讀取該Cookie。 Secure:在Cookie中標記該變量, 代表只有當瀏覽器和Web Server之間的通訊協議爲加密認證協議時, 瀏覽器才向服務器提交相應的Cookie。當前這種協議只有一種,即爲HTTPS。
cookie 在 Request Headers 中的傳輸格式
Cookie: KEY=VALUE; KEY=VALUE; KEY=VALUE 是沒有 域 和 過時時間 的
兩個網頁一級域名相同,只是二級域名不一樣,瀏覽器容許經過設置document.domain共享 Cookie。程序員
document.domain = 'example.com';
若是兩個網頁不一樣源,就沒法拿到對方的DOM。json
典型的例子是iframe窗口和window.open方法打開的窗口,它們與父窗口沒法通訊。
AJAXapi
除了架設服務器代理(瀏覽器請求同源服務器,再由後者請求外部服務),跨域
vue項目中 開發環境的跨域處理瀏覽器
proxyTable安全
dev: { // Paths assetsSubDirectory: 'static', assetsPublicPath: './', proxyTable: { '/api': { target: 'http://temp.com',// 請換成你須要跨域請求的地址 changeOrigin: true, pathRewrite: { '^/api': '' } } } }
proxyTable中的pathRewrite的/api理解成用‘/api’代替target裏面的地址,
後面組件中咱們掉接口時直接用api代替 服務器
有三種方法規避這個限制
JSONP WebSocket CORS
JSONP 是服務器與客戶端跨源通訊的經常使用方法。 最大特色就是簡單適用,老式瀏覽器所有支持,服務器改造很是小。 它的基本思想是,網頁經過添加一個<script>元素,向服務器請求JSON數據, 這種作法不受同源政策限制;服務器收到請求後,將數據放在一個指定名字的回調函數裏傳回來。 WebSocket WebSocket是一種通訊協議,使用ws://(非加密)和wss://(加密)做爲協議前綴。 該協議不實行同源政策,只要服務器支持,就能夠經過它進行跨源通訊。 CORS CORS是跨源資源分享(Cross-Origin Resource Sharing)的縮寫。 它是W3C標準,是跨源AJAX請求的根本解決方法。 相比JSONP只能發GET請求,CORS容許任何類型的請求。
CORS須要瀏覽器和服務器同時支持。目前,全部瀏覽器都支持該功能,IE瀏覽器不能低於IE10。
整個CORS通訊過程,都是瀏覽器自動完成,不須要用戶參與。對於開發者來講,CORS通訊與同源的AJAX通訊沒有差異,代碼徹底同樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感受。
所以,實現CORS通訊的關鍵是服務器。只要服務器實現了CORS接口,就能夠跨源通訊。
兩種請求
瀏覽器將CORS請求分紅兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
只要同時知足如下兩大條件,就屬於簡單請求
(1)請求方法是如下三種方法之一: HEAD GET POST (2)HTTP的頭信息不超出如下幾種字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain 凡是不一樣時知足上面兩個條件,就屬於非簡單請求。
簡單請求
對於簡單請求,瀏覽器直接發出CORS請求。具體來講,就是在頭信息之中,增長一個Origin字段。
下面是一個例子,瀏覽器發現此次跨源AJAX請求是簡單請求,就自動在頭信息之中,添加一個Origin字段。
GET /cors HTTP/1.1 Origin: http://api.bob.com Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...
上面的頭信息中,Origin字段用來講明,本次請求來自哪一個源(協議 + 域名 + 端口)。服務器根據這個值,決定是否贊成此次請求。
若是Origin指定的源,不在許可範圍內,服務器會返回一個正常的HTTP迴應。瀏覽器發現,這個迴應的頭信息沒有包含Access-Control-Allow-Origin字段(詳見下文),就知道出錯了,從而拋出一個錯誤,被XMLHttpRequest的onerror回調函數捕獲。注意,這種錯誤沒法經過狀態碼識別,由於HTTP迴應的狀態碼有多是200。
若是Origin指定的域名在許可範圍內,服務器返回的響應,會多出幾個頭信息字段。
Access-Control-Allow-Origin: http://api.bob.com Access-Control-Allow-Credentials: true Access-Control-Expose-Headers: FooBar Content-Type: text/html; charset=utf-8
上面的頭信息之中,有三個與CORS請求相關的字段,都以Access-Control-開頭。
該字段是必須的。它的值要麼是請求時Origin字段的值,要麼是一個*,表示接受任意域名的請求。
該字段可選。它的值是一個布爾值,表示是否容許發送Cookie。默認狀況下,Cookie不包括在CORS請求之中。設爲true,即表示服務器明確許可,Cookie能夠包含在請求中,一塊兒發給服務器。這個值也只能設爲true,若是服務器不要瀏覽器發送Cookie,刪除該字段便可。
該字段可選。CORS請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。若是想拿到其餘字段,就必須在Access-Control-Expose-Headers裏面指定。上面的例子指定,getResponseHeader('FooBar')能夠返回FooBar字段的值。
非簡單請求
非簡單請求是那種對服務器有特殊要求的請求,好比請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json。
非簡單請求的CORS請求,會在正式通訊以前,增長一次HTTP查詢請求,稱爲"預檢"請求(preflight)。
瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可使用哪些HTTP動詞和頭信息字段。只有獲得確定答覆,瀏覽器纔會發出正式的XMLHttpRequest請求,不然就報錯。
"預檢"請求用的請求方法是OPTIONS,表示這個請求是用來詢問的。頭信息裏面,關鍵字段是Origin,表示請求來自哪一個源。
除了Origin字段,"預檢"請求的頭信息包括兩個特殊字段。
該字段是必須的,用來列出瀏覽器的CORS請求會用到哪些HTTP方法,上例是PUT。
Access-Control-Request-Headers
該字段是一個逗號分隔的字符串,指定瀏覽器CORS請求會額外發送的頭信息字段,上例是X-Custom-Header。
OPTIONS /cors HTTP/1.1 Origin: http://api.bob.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...
預檢請求的迴應
服務器收到"預檢"請求之後,檢查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段之後,確認容許跨源請求,就能夠作出迴應。
HTTP/1.1 200 OK Date: Mon, 01 Dec 2008 01:15:39 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: http://api.bob.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain 上面的HTTP迴應中,關鍵的是Access-Control-Allow-Origin字段, 表示http://api.bob.com能夠請求數據。該字段也能夠設爲星號,表示贊成任意跨源請求。
關於更多的cors詳情請查看阮一峯 跨域資源共享 CORS 詳解