前後端分離項目中的跨域問題 即同源策略
同源策略:同源策略/SOP(Same origin policy)是一種約定,由 Netscape 公司 1995 年引入浏覽器,它是浏覽器最核心也最基本的安全功能,現在所有支持 JavaScript 的浏覽器都會使用這個策略。如果缺少了同源策略,浏覽器很容易受到 XSS、 CSFR 等攻擊。
同源是指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個 ip 地址,也非同源。
源就是協議、域名和端口號。
協議:http,https
跨域:前端請求URL的協議、域名、端口與前端頁面URL不同就是跨域
# 1、安裝第三方庫 django-cors-headers
# 2、在settings.py中添加'corsheaders.middleware.CorsMiddleware',在SessionMiddleware和CommonMiddleware的中間
# 3、在INSTALLED_APPS裡添加“corsheaders”
INSTALLED_APPS = [
'search.apps.SearchConfig',
'data.apps.DataConfig',
'record_data.apps.RecordDataConfig',
'deleted_data.apps.DeletedDataConfig',
'mgmt.apps.MgmtConfig',
'c_test.apps.CTestConfig',
'rest_framework',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders', # 新增
]
# 4、在中間件中添加corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware
MIDDLEWARE = [
# 'utils.middleware.ExceptionMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', # 新增/必須在common中間件上面
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 5、在settings.py底部增加
CORS_ALLOW_CREDENTIALS = True # 允許攜帶cookie
CORS_ORIGIN_ALLOW_ALL = True # 放行所有
CORS_ORIGIN_WHITELIST = ('*') # 白名單
# CORS_ALLOW_METHODS:字符串列表,允許用哪些HTTP請求方法。
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# CORS_ALLOW_HEADERS:字符串列表,允許使用哪些非標准HTTP請求頭。
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
# 可以自己注冊一個中間件,在中間件process_response方法中對response進行封裝
def process_response(self, request, response):
response["Content-Type"] = "application/json" # 響應信息的內容格式
response["Access-Control-Allow-Origin"] = "*" # 允許跨域請求的源地址, * 表示:允許所有地址
response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS" # 允許跨域請求的具體方法
response["Access-Control-Max-Age"] = "1000" # 用來指定本次預檢請求的有效期,單位為秒,,在此期間不用發出另一條預檢請求。
response["Access-Control-Allow-Headers"] = "*"
return response
跨域實現流程為
1、浏覽器會第一次先發送options請求詢問後端是否允許跨域,後端查詢白名單中是否有這兩個域名
2、如過域名在白名單中則在響應結果中告知浏覽器允許跨域
3、浏覽器第二次發送post請求,攜帶用戶登錄數據到後端,完成登錄驗證操作
1,什麼是CORS 允許浏覽器向跨源(協議 + 域名 + 端口)服務器發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制 2,特點 1,浏覽器自動完成(在請求頭中加入特 ...
一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...
一個源的定義 如果兩個頁面的協議,端口(如果有指定)和域名都相同,則兩個頁面具有相同的源. 舉個例子: 下表給出了相對http://a.xyz.com/dir/page.html同源檢測的示例: UR ...
一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一種約定,它是浏覽器最 ...
一.Django中的緩存: 前戲: 在動態網站中,用戶所有的請求,服務器都會去數據庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最後生成用戶看到的頁面. 當一個網站的用戶訪問量很大的時候,每一 ...
一. Django處理跨域 跨域的處理方式有很多,使用最多的就是CORS(跨域資源共享),接下來大致提一下django中處理跨域的配置. 首先安裝django-cors-headers模塊: pip ...
1.跨域原理 #1. 首先浏覽器安全策略限制js ajax跨域訪問服務器 #2. 如果服務器返回的頭部信息中有當前域: // 允許 http://localhost:8080 這個網站打開的頁面中的j ...
1.創建一個測試項目 1.1 創建項目和APP django-admin startproject BookManage # 創建項目 python manage.py startapp books ...
1.創建一個測試項目 1.1 創建項目和APP '''1.創建項目和APP''' django-admin startproject BookManage # 創建項目 python mana ...
1.跨越原理 1. 首先浏覽器安全策略限制js ajax跨域訪問服務器 2. 如果服務器返回的頭部信息中有當前域: // 允許 http://localhost:8080 這個網站打開的頁面中的js訪 ...
4.1 實現PageProcessor 這部分我們直接通過GithubRepoPageProcessor這個例子來介紹PageProcessor的編寫方式.我將PageProcessor的定制分為三個 ...
參考資料: LINQ系列:LINQ to DataSet的DataTable操作 List<T>轉換為DataTable C# DataTable 和List之間相互轉換的方法 Linq中 ...
· 什麼是數據庫? 存放數據的倉庫. · 數據庫和數據結構有什麼區別? 數據結構要解決在內存中操作數據的問題,數據庫要解決在硬盤中操作數據的問題.數據結構研究一些抽象數據模型(ADT)和以及定義在該模 ...
web項目開發中,有三個實踐對於項目成功是非常重要的: 1. staging servers 2. Version control workflows 3. Tested, repeatable de ...
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1609 給出一串由1,2,3組成的數,求最少需要改動多少個數,使其成為不降或不升序列. 分析 法 ...
Fox Ciel is participating in a party in Prime Kingdom. There are n foxes there (include Fox Ciel). T ...
如果配置沒問題的話,就是 Oracle.ManagedDataAccess 在全局程序集的版本問題 解決方法方法 將Oracle.ManagedDataAccess GAC全局程序集中移除 1:用C ...
CharSequence的getText()與String的getString()『Android系列七』 曾經在學習中碰見兩種獲取常量的方式: CharSequence chrs = getText ...
02-jQuery的選擇器 我們以前在CSS中學習的選擇器有: 今天來學習一下jQuery 選擇器. jQuery選擇器是jQuery強大的體現,它提供了一組方法,讓我們更加方便的獲取到頁面中的元 ...
lsof(list open files)是一個列出當前系統打開文件的工具.在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件.所以如傳輸控制協議 ...