摘要:超文本傳輸協(xié)議訪問(wèn)該資源。它的基本思想是,網(wǎng)頁(yè)通過(guò)添加一個(gè)元素,向服務(wù)器請(qǐng)求數(shù)據(jù),這種做法不受同源政策限制服務(wù)器收到請(qǐng)求后,將數(shù)據(jù)放在一個(gè)指定名字的回調(diào)函數(shù)里傳回來(lái)。該字段也可以設(shè)為星號(hào),表示同意任意跨源請(qǐng)求。
前言:隨著工作時(shí)間的增長(zhǎng),前面學(xué)過(guò)的東西開(kāi)始慢慢遺忘,抽空的時(shí)候就將一些資料整理整理,順一順,也當(dāng)作一種溫習(xí)。
我只是前端工匠,防止自己成為【一斷網(wǎng)就無(wú)法工作的程序員】
協(xié)議類型(protocol)
通過(guò)URL可以指定的主要有以下幾種:http、ftp、gopher、telnet、file等 URL的組成協(xié)議 1、protocol(協(xié)議):指定使用的傳輸協(xié)議,下表列出 protocol 屬性的有效方案名稱。 最常用的是HTTP協(xié)議,它也是目前WWW中應(yīng)用最廣的協(xié)議。 http —— 超文本傳輸協(xié)議訪問(wèn)該資源。 格式 http:// https —— 用安全套接字層傳送的超文本傳輸協(xié)議訪問(wèn)該資源。 格式 https:// ftp —— 通過(guò) FTP訪問(wèn)資源。格式 FTP:// mailto —— 電子郵件地址 通過(guò) SMTP 訪問(wèn)。 格式 mailto: ldap —— 輕型目錄訪問(wèn)協(xié)議搜索 file —— 資源是本地計(jì)算機(jī)上的文件。格式file:// news —— Usenet新聞組 gopher —— Gopher協(xié)議 telnet —— Telnet協(xié)議
主機(jī)名(hostname)
是指存放資源的服務(wù)器的域名系統(tǒng) (DNS) 主機(jī)名或 IP 地址。 有時(shí),在主機(jī)名前也可以包含連接到服務(wù)器所需的用戶名和密碼(格式:username:password)。
端口號(hào)(port)
整數(shù),可選,省略時(shí)使用方案的默認(rèn)端口,各種傳輸協(xié)議都有默認(rèn)的端口號(hào), 如http的默認(rèn)端口為80,https的默認(rèn)端口為443
路徑及文件名(path)
由零或多個(gè)“/”符號(hào)隔開(kāi)的字符串,一般用來(lái)表示主機(jī)上的一個(gè)目錄或文件地址
參數(shù)(parameters)
傳遞參數(shù),可有多個(gè)參數(shù),用“&”符號(hào)隔開(kāi),每個(gè)參數(shù)的名和值用“=”符號(hào)隔開(kāi)
hash值
#是用來(lái)指導(dǎo)瀏覽器動(dòng)作的,對(duì)服務(wù)器端完全無(wú)用。所以,HTTP請(qǐng)求中不包括#。 這些字符都不會(huì)被發(fā)送到服務(wù)器端。 改變#不觸發(fā)網(wǎng)頁(yè)重載 改變#會(huì)改變?yōu)g覽器的訪問(wèn)歷史 默認(rèn)情況下,Google的網(wǎng)絡(luò)蜘蛛忽視URL的#部分。 但是,Google還規(guī)定,如果你希望Ajax生成的內(nèi)容被瀏覽引擎讀取, 那么URL中可以使用"#!",Google會(huì)自動(dòng)將其后面的內(nèi)容轉(zhuǎn)成查詢字符串_escaped_fragment_的值同源策略
協(xié)議相同
域名相同
端口相同
如果非同源,共有三種行為收到限制
(1) Cookie、LocalStorage 和 IndexDB 無(wú)法讀取。 (2) DOM 無(wú)法獲得。 (3) AJAX 請(qǐng)求不能發(fā)送。Cookie
Cookie 是服務(wù)器寫(xiě)入瀏覽器的一小段信息,只有同源的網(wǎng)頁(yè)才能共享。
cookie的組成部分
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE NAME=VALUE NAME是該Cookie的名稱,VALUE是該Cookie的值。 在字符串“NAME=VALUE”中,不含分號(hào)、逗號(hào)和空格等字符。 Expires=DATE:Expires變量是一個(gè)只寫(xiě)變量,它確定了Cookie有效終止日期。 該屬性值DATE必須以特定的格式來(lái)書(shū)寫(xiě):星期幾,DD-MM-YY HH:MM:SS GMT, GMT表示這是格林尼治時(shí)間。 反之,不以這樣的格式來(lái)書(shū)寫(xiě),系統(tǒng)將無(wú)法識(shí)別。 該變量可省,如果缺省時(shí),則Cookie的屬性值不會(huì)保存在用戶的硬盤(pán)中, 而僅僅保存在內(nèi)存當(dāng)中,Cookie文件將隨著瀏覽器的關(guān)閉而自動(dòng)消失。 Domain=DOMAIN-NAME:Domain該變量是一個(gè)只寫(xiě)變量, 它確定了哪些Internet域中的Web服務(wù)器可讀取瀏覽器所存取的Cookie, 即只有來(lái)自這個(gè)域的頁(yè)面才可以使用Cookie中的信息。 這項(xiàng)設(shè)置是可選的,如果缺省時(shí),設(shè)置Cookie的屬性值為該Web服務(wù)器的域名。 Path=PATH:Path屬性定義了Web服務(wù)器上哪些路徑下的頁(yè)面可獲取服務(wù)器設(shè)置的Cookie。 一般如果用戶輸入的URL中的路徑部分從第一個(gè)字符開(kāi)始包含Path屬性所定義的字符串, 瀏覽器就認(rèn)為通過(guò)檢查。如果Path屬性的值為“/”, 則Web服務(wù)器上所有的WWW資源均可讀取該Cookie。 Secure:在Cookie中標(biāo)記該變量, 表明只有當(dāng)瀏覽器和Web Server之間的通信協(xié)議為加密認(rèn)證協(xié)議時(shí), 瀏覽器才向服務(wù)器提交相應(yīng)的Cookie。當(dāng)前這種協(xié)議只有一種,即為HTTPS。
cookie 在 Request Headers 中的傳輸格式
Cookie: KEY=VALUE; KEY=VALUE; KEY=VALUE 是沒(méi)有 域 和 過(guò)期時(shí)間 的跨域處理
兩個(gè)網(wǎng)頁(yè)一級(jí)域名相同,只是二級(jí)域名不同,瀏覽器允許通過(guò)設(shè)置document.domain共享 Cookie。
document.domain = "example.com";
如果兩個(gè)網(wǎng)頁(yè)不同源,就無(wú)法拿到對(duì)方的DOM。
典型的例子是iframe窗口和window.open方法打開(kāi)的窗口,它們與父窗口無(wú)法通信。
AJAX
除了架設(shè)服務(wù)器代理(瀏覽器請(qǐng)求同源服務(wù)器,再由后者請(qǐng)求外部服務(wù)),
vue項(xiàng)目中 開(kāi)發(fā)環(huán)境的跨域處理
proxyTable
dev: { // Paths assetsSubDirectory: "static", assetsPublicPath: "./", proxyTable: { "/api": { target: "http://temp.com",// 請(qǐng)換成你需要跨域請(qǐng)求的地址 changeOrigin: true, pathRewrite: { "^/api": "" } } } }
proxyTable中的pathRewrite的/api理解成用‘/api’代替target里面的地址,
后面組件中我們掉接口時(shí)直接用api代替
有三種方法規(guī)避這個(gè)限制
JSONP WebSocket CORS
JSONP 是服務(wù)器與客戶端跨源通信的常用方法。 最大特點(diǎn)就是簡(jiǎn)單適用,老式瀏覽器全部支持,服務(wù)器改造非常小。 它的基本思想是,網(wǎng)頁(yè)通過(guò)添加一個(gè)