目錄
Cookie
跨網域處理
CORS詳解
首頁 web前端 H5教程 url完整結構以及同源跨域處理的介紹

url完整結構以及同源跨域處理的介紹

Mar 02, 2019 pm 03:15 PM
html5 javascript node.js typescript

這篇文章帶給大家的內容是關於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的組成部分
    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。

典型的例子是iframe窗口和window.open方法打开的窗口,它们与父窗口无法通信。
登入後複製

AJAX

除了架設伺服器代理程式(瀏覽器請求同源伺服器,再由後者請求外部服務),

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詳解

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-开头。

  1. Access-Control-Allow-Origin

    该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求

  2. Access-Control-Allow-Credentials

    该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

  3. Access-Control-Expose-Headers

    该字段可选。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字段,"预检"请求的头信息包括两个特殊字段。

Access-Control-Request-Method

该字段是必须的,用来列出浏览器的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可以请求数据。该字段也可以设为星号,表示同意任意跨源请求。
登入後複製

以上是url完整結構以及同源跨域處理的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles