完整的url以及同源跨域处理
url的完整結構
協議類型(protocol) 通過URL可以指定的主要有以下幾種:http、ftp、gopher、telnet、file等URL的組成協議 1、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
Cookie 是服務器寫入瀏覽器的一小段信息,只有同源的網頁才能共享。
cookie的組成部分 Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURENAME=VALUENAME是該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。
典型的例子是iframe窗口和window.open方法打開的窗口,它們與父窗口無法通信。AJAX
除了架設服務器代理(瀏覽器請求同源服務器,再由后者請求外部服務),
vue項目中 開發環境的跨域處理
proxyTable
dev: {// PathsassetsSubDirectory: 'static',assetsPublicPath: './',proxyTable: {'/api': {target: 'http://temp.com',// 請換成你需要跨域請求的地址changeOrigin: true,pathRewrite: {'^/api': ''}}} }proxyTable中的pathRewrite的/api理解成用‘/api’代替target里面的地址,
后面組件中我們掉接口時直接用api代替
有三種方法規避這個限制
JSONP WebSocket CORSCORS詳解
CORS需要瀏覽器和服務器同時支持。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。
整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。
因此,實現CORS通信的關鍵是服務器。只要服務器實現了CORS接口,就可以跨源通信。
兩種請求瀏覽器將CORS請求分成兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
只要同時滿足以下兩大條件,就屬于簡單請求
(1)請求方法是以下三種方法之一:HEADGETPOST(2)HTTP的頭信息不超出以下幾種字段:AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type:只限于三個值application/x-www-form-urlencoded、multipart/form-data、text/plain凡是不同時滿足上面兩個條件,就屬于非簡單請求。 簡單請求對于簡單請求,瀏覽器直接發出CORS請求。具體來說,就是在頭信息之中,增加一個Origin字段。
下面是一個例子,瀏覽器發現這次跨源AJAX請求是簡單請求,就自動在頭信息之中,添加一個Origin字段。
GET /cors HTTP/1.1Origin: http://api.bob.comHost: api.alice.comAccept-Language: en-USConnection: keep-aliveUser-Agent: Mozilla/5.0...上面的頭信息中,Origin字段用來說明,本次請求來自哪個源(協議 + 域名 + 端口)。服務器根據這個值,決定是否同意這次請求。
如果Origin指定的源,不在許可范圍內,服務器會返回一個正常的HTTP回應。瀏覽器發現,這個回應的頭信息沒有包含Access-Control-Allow-Origin字段(詳見下文),就知道出錯了,從而拋出一個錯誤,被XMLHttpRequest的onerror回調函數捕獲。注意,這種錯誤無法通過狀態碼識別,因為HTTP回應的狀態碼有可能是200。
如果Origin指定的域名在許可范圍內,服務器返回的響應,會多出幾個頭信息字段。
Access-Control-Allow-Origin: http://api.bob.comAccess-Control-Allow-Credentials: trueAccess-Control-Expose-Headers: FooBarContent-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 OKDate: Mon, 01 Dec 2008 01:15:39 GMTServer: Apache/2.0.61 (Unix)Access-Control-Allow-Origin: http://api.bob.comAccess-Control-Allow-Methods: GET, POST, PUTAccess-Control-Allow-Headers: X-Custom-HeaderContent-Type: text/html; charset=utf-8Content-Encoding: gzipContent-Length: 0Keep-Alive: timeout=2, max=100Connection: Keep-AliveContent-Type: text/plain上面的HTTP回應中,關鍵的是Access-Control-Allow-Origin字段,總結
以上是生活随笔為你收集整理的完整的url以及同源跨域处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二手车租赁中介费怎么收取的?
- 下一篇: 中海一实验坐什么车?