🍖09 跨域请求详解
一.浏览器的同源策略
1.同源策略介绍
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现
2.同源策略判断依据
-
请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同
-
比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
-
浏览器上就会报错,个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险
二.CORS : 跨域资源共享简介(后端技术)
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信
ps : 出现跨域问题(前后端分离项目不可避免)是因为浏览器拦截了, 解决方法:
CORS (跨域资源共享:后端技术) # 主流采用的方案,使用第三方插件
前端代理 # node起了一个服务,只在测试阶段使用(正向代理)
jsonp # 只能解决get请求跨域,本质原理是使用了某些标签不限制跨域(img,script)
nginx转发 # 后面详细讲
三.CORS 基本流程
1.CORS请求分类
- 简单请求 (simple request)
- 非简单请求 (not-so-simple request)
2.请求分类解释
- 简单请求:简单请求只发一次
- 非简单请求:发送两次,第一次是options请求,第二次是真正的请求
四.两种请求详解
只要同时满足以下两大条件,就属于简单请求
凡是不同时满足下面两个条件,就属于非简单请求
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
五.浏览器对于这两种请求的处理
1.简单请求, 支持跨域
- 需服务器设置响应头:
Access-Control-Allow-Origin = ‘域名’ 或 ‘*’
2.复杂请求, 支持跨域
由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据,所以:
- “预检”请求时,允许请求方式, 则需要服务器设置响应头:
Access-Control-Request-Method
- “预检”请求时,允许请求头, 则需要服务器设置响应头:
Access-Control-Request-Headers
六.Django 项目中支持 CORS
1.在返回结果中添加允许信息 (简单请求)
def test(request):
import json
obj=HttpResponse(json.dumps({'name':'shawn'}))
# obj['Access-Control-Allow-Origin']='*' # 允许所有
obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004' # 只允许该域
return obj
2.在中间件中处理复杂请求和简单请求
from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
def process_response(self,request,response):
if request.method=="OPTIONS":
#可以加 '*'
response["Access-Control-Allow-Headers"]="Content-Type"
response["Access-Control-Allow-Origin"] = "http://localhost:8080"
return response
七.使用第三方 django-cors-headers 解决跨域问题
1.安装
pip install django-cors-headers
2.在配置文件中进行应用注册
INSTALLED_APPS = [
....
'corsheaders',
]
3.添加中间件
MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
]
4.在配置文件中添加相关配置
CORS_ALLOW_CREDENTIALS = True
# 允许所有域(与下面的一个配置相同,保留一个就行)
CORS_ORIGIN_ALLOW_ALL = True
# 允许的域, "*" : 所有, (如果是全部,则与上面的相同,保留一个就行)
CORS_ORIGIN_WHITELIST = (
'*'
)
# 允许的请求方式
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# 允许的HTTP头信息字段
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)