1. 程式人生 > >瀏覽器跨域請求tornado相關設定及跨域引數介紹

瀏覽器跨域請求tornado相關設定及跨域引數介紹

場景

給前端一圖流寫後臺介面,前端使用vue在本地開發,請求後臺服務相關介面屬於跨域請求。

解決辦法

方案一:每個方法設定請求頭

TODO

方案二:在base類中設定,所以涉及到跨域的類的都繼承該base類:

def set_default_headers(self):
    #self.set_header("Access-Control-Allow-Origin", "http://127.0.0.1:8020")
    self.set_header("Access-Control-Allow-Origin", "*")
    #self.set_header("Access-Control-Allow-Credentials", "true")
    self.set_header("Access-Control-Allow-Headers", "x-requested-with")
    self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')

跨域引數介紹

CORS是一個W3C標準,全稱是“跨域資源共享”(Cross-origin resource sharing)。
它允許瀏覽器向跨源伺服器,發出XMLHTTPRequest請求,從而客克服了AJAX只能同源使用的限制。

一、簡介

  CORS需要瀏覽器和伺服器同時支援。目前,所有的瀏覽器都支援該功能,其中IE瀏覽器不能低於IE10。
  整個CROS通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,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-ww-form-urlencoded、multipart/form-data、text/plain

凡是不滿足上面兩個條件,就屬於非簡單請求。
瀏覽器對這兩種請求的處理,是不一樣的。

三、簡單請求

對於簡單請求,瀏覽器直接發出CORS請求。具體來說,就是在頭資訊之中,增加一個Origin欄位。
下面是一個例子,瀏覽器發現這次跨域ajax請求是簡單請求,就自動在頭資訊之中,新增一個origin欄位。

General:
	Request URL: https://api.growingio.com...
	Request Method: POST
	Status Code: 200 OK
	Remote Address: 54.223.xxx.xxx:post
	Referrer Policy: no-referrer-when-downgrade
Response Headers:
	Access-Control-Allow-Credentials: true
	Access-Control-Allow-Headers: x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp
	Access-Control-Allow-Methods: POST, GET, OPTIONS
	Access-Control-Allow-Origin: https://www.xxx.com
	Connection: keep-alive
	Content-Length: 0
	Content-Type: text/plain; charset=utf-8
	Date: Fri, 28 Sep 2018 07:55:17 GMT
	P3P: policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"
	Server: nginx
Request:
	Origin: https://www.xxx.com
	Referer: https://www.xxx.com/xxx
	User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1

上面的request頭資訊中,Origin欄位用來說明本次請求來自哪個源(協議+域名+埠)。伺服器根據這個值,決定是否同意這次請求。
如果

Origin指定的源,不在許可範圍內,伺服器會返回一個正常的HTTP響應。瀏覽器發現,這個迴應的頭資訊沒有包含Access-Control-Allow-Origin欄位,就知道出錯了,從而跑出丟擲一個錯誤,被XMLHttpRequest的onerrror回撥函式捕獲。注意,這種錯誤無法通過狀態碼識別,因為HTTP迴應的狀態碼有可能是200。

如果Origin指定的域名在許可範圍內,伺服器返回的響應,會多出幾個頭資訊欄位。
在這裡插入圖片描述

上面的頭資訊之中,有三個與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裡面指定。

withCredentials 屬性

上面說到,CORS請求預設不傳送Cookie和HTTP認證資訊。如果要把Cookie發到伺服器,一方面要伺服器同意,指定Access-Control-Allow-Credentials欄位。

Access-Control-Allow-Credentials: true

另一方面,開發者必須在AJAX請求中開啟withCredentials屬性。

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

否則,即使伺服器同意傳送Cookie,瀏覽器也不會發送。或者,伺服器要求設定Cookie,瀏覽器也不會處理。

但是,如果省略withCredentials設定,有的瀏覽器還是會一起傳送Cookie。這時,可以顯式關閉withCredentials。

xhr.withCredentials = false;

要注意的是,如果要傳送Cookie,Access-Control-Allow-Origin就不能設為星號,必須指定明確的、與請求網頁一致的域名。同時,Cookie依然遵循同源政策,只有用伺服器域名設定的Cookie才會上傳,其他域名的Cookie並不會上傳,且(跨源)原網頁程式碼中的document.cookie也無法讀取伺服器域名下的Cookie。

四、非簡單請求

4.1 預檢請求

相關推薦

瀏覽器請求tornado相關設定引數介紹

場景 給前端一圖流寫後臺介面,前端使用vue在本地開發,請求後臺服務相關介面屬於跨域請求。 解決辦法 方案一:每個方法設定請求頭 TODO 方案二:在base類中設定,所以涉及到跨域的類的都繼承該base類: def set_default_headers(s

FPGA中亞穩態相關問題時鐘處理

設計 時鐘 比特 產生 solution 至少 nbsp 觸發器 路徑規劃 前言 觸發器輸入端口的數據在時間窗口內發生變化,會導致時序違例。觸發器的輸出在一段時間內徘徊在一個中間電平,既不是0也不是1。這段時間稱為決斷時間(resolution time)。經過resolu

請求的常用方式解釋

指定 strong json2 提交 能力 路徑 消息 string 動態 同源策略 首先基於安全的原因,瀏覽器是存在同源策略這個機制的,同源策略阻止從一個域加載的腳本去獲取另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這意味著瀏

vue-cli(vue2.x)配置請求代理,設定請求

1、在config/index.js設定配置檔案,跨域配置代理 (預設裡面內容為空,我們需要加入對跨域介面的配置) 根據介面的不同設定的請求頭和主機也不同,自己按照格式要求進行配置即可。 如上圖配置好了之後,'/apis/getSongLyric'為自定義的axios請求路徑,自己根據相

Ajax請求,無法傳遞接收cookie資訊

最近在做一個系統遇到一個問題,在網上找個一個和我遇到相同問題的(原文地址:https://www.cnblogs.com/helloyy/p/6109665.html)按照他的步驟還是沒有解決,繼續查詢資料,根據他的方法做出修改,最後解決。(不想寫字就自己拿過來了。。) 應用場景:   專案測試環境:前端

vue2+webpack使用axios請求資料的設定

初次使用vue搭建專案,在進行互動請求資料時候報了經常會出現的錯誤, Failed to load http://localhost:3000/add: No 'Access-Control-Allow-Origin' header is present on the requested res

Flask 解決請求情況下PUTDELETE請求變成OPTIONS請求的問題

可以在後端響應頭上加上Allow-origin解決跨域問題,但是PUT和DELETE請求會變成OPTIONS請求,這時候如果後端不做處理的話,瀏覽器是不會再發送後續請求的 如下: // 前端程式碼 $('.todos').on('click', '.cell

Windows 上 SQLyog 連線 CentSO7 上 MySql 相關設定常見問題

一、版本相關 1. CentOS7 # cat /etc/redhat-release  CentOS Linux release 7.4.1708 (AltArch)  2. Mysql # mysql -V mysql  Ver 14.14 Di

js原生態請求與ajax中jsonp請求

在web開發中我們經常會說起指令碼的跨域訪問的問題,會出現跨域訪問的限制是因為javascript語言安全限制中的同源策略(same-origin policy )所造成的。 同源策略簡單的說就是一段指令碼只能讀取來自於同一來源的資源,這裡的同一來源指的是主機

spyder的相關設定debug

加班是常事,盯著白晃晃的螢幕,感覺臉色更蒼白了呢,於是想著如何設定一下背景,記錄一下: tools >>preferences >>syntax coloring 接下來是設定相應的值,看個人喜好了,我看了一下大佬的,感覺看著還是

請求(使用jsonp實現請求)百度地圖api證逆地址解析獲取周邊資訊(pois)

新手程式設計師,新手部落格,如果那裡寫的不好,還請大神們補充,指錯 最近專案裡面需要做一個電子圍欄的功能,我這邊做的就是需要把商戶的地址的經緯度存進資料庫,本來這些從百度地圖API裡面有Demo可以看,但是我是訪問的百度地圖的可以獲取經緯度以及根據經緯度進行周邊檢索的地址

Windows server 2012 控制器之間角色轉移清理控方法,實現輔助控提升為主

域控角色轉移 輔助域控提升為主域控 域控制器之間角色遷移 ntdsutil工具 架構主機角色 本章博文講述Windows server 2012 域控制器之間角色轉移及刪除域控方法 。針對不同的應用場景,對操作方法進行了歸納與總結 。下面分2種場景做介紹 :場景1:主域控制器與輔助

django設定並獲取cookie/session,檔案上傳,ajax接收檔案,post/get請求請求等的方法

django設定並獲取cookie/session,檔案上傳,ajax接收檔案等的方法: views.py檔案: from django.shortcuts import render,HttpResponse,redirect import datetime import json from

前後端分離,解決問題django的csrf請求保護 ajax headers JavaScript ajax 請求 +設定headers 實踐

1. 前後端分離解決跨域問題 解決跨域呼叫服務並設定headers 主要的解決方法需要通過伺服器端設定響應頭、正確響應options請求,正確設定 JavaScript端需要設定的headers資訊 方能實現; 關於跨域,前端會先發送OPTIONS請求,進行預檢,檢查後端是否允許前端設定的相應的請求頭,請

ajax獲取json數據實現請求

cgi size 域名 3.2 方便 nap 不清楚 anti dex 最近想練習一下ajax獲取json數據 , 首先上網找一些在線的可用來測試的接口. -----------------------------------------------------這裏是接口分

請求相關知識

char 不同 自定義 解析 style 設置 調用 create ont 一、跨域請求概念 請求在域名、端口或協議不同的服務器上的數據過程 二、原生js跨域請求 先獲取接口URL並設置相應的參數,如回調函數,然後把URL添加到createElement(“script”)

瀏覽器同源策略,解決方案

ebo 同名 () hash 站點 題解 先來 說了 是否 一、Origin(源) 源由下面三個部分組成: 域名 端口 協議 兩個 URL ,只有這三個都相同的情況下,才可以稱為同源。 下來就以 "http://www.example.com/page.html" 這個

jsonp請求,常見的集中書寫方式,優缺點比較

簡介     符合Web2.0特徵的眾多網站一個明顯的特點就是採用Ajax。Ajax提供了在後臺提交請求訪問資料的功能。其實現主要使用的是XMLHttpRequest函式,這個函式允許客戶端的Javascript傳送到伺服器端的HTTP請求並獲得返回資料。Ajax同時也是

Spring Boot Web應用開發 CORS 請求設定 Invalid CORS request

使用SpringBoot Web開發程式時,前後端分離時,經常遇到跨域問題,特別是很多情況下Firefox瀏覽器沒有問題,而chrome瀏覽器有問題,僅僅從瀏覽器的web控制檯很難發現有效的錯誤或者告警資訊,因此在開發程式很有必要在開發階段就考慮到並配置好跨域。 SpringBoot

相關知識實現的方法

對於跨域,可能對於不瞭解的有一定的難度,下面就和大家聊一下關於跨域的知識。 跨域瞭解一下? 其實跨域就是指一個域名的網頁請求其他域名網頁資源,但是瀏覽器不能執行其他網站的指令碼,根本原因是由於同源政策的限制(等一下再說同源政策),而同源政策是瀏覽器施加的安全限制。 同源政策? 同源策略/SO