目录
跨域请求问题解决
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
什么是同源:请求的地址 必须在同一个域上 必须要 端口 ip 协议都要一样
问题:我们前端发送的ajax请求,到后端 那肯定不同源,所以导致我们请求成功后数据也无法返回,数据会被浏览器拦截
我们在浏览器中输入的域名其实也是 ip地址 默认都是80端口
补充:浏览器中输入域名,没有加端口
-www.baidu.com---->dns--->解析成地址 192.168.2.3----》没有加端口,默认是80
-dns解析,先找本地的host文件
-可以修改本地的host做映射
-键值对的形式 127.0.0.1 www.moongod.com
# 这样当你在浏览器输入 www.moongod.com 会解析为 127.0.0.1
解决跨域问题方式
方式一:CORS方法,后端代码控制
# 第一步:安装
pip install django-cors-headers
# 第二步:配置app
INSTALLED_APPS = [
'corsheaders'
]
# 第三步:配置中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
]
# 第四步:在配置文件配置
# 允许所有域
CORS_ORIGIN_ALLOW_ALL = True
# 允许的请求方式
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# 允许请求头中加的东西
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
'token',
)
# 这样配置就解决了跨域问题
方式二:Nginx反向代理
简单请求与非简单请求
(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
# 这都是简单请求,非简单请求就是除去 以上简单请求、
非简单请求会先发送一个options,如果运行,再发真正的请求
所以我们要后端先通过options请求
自己编写中间件处理
跨域资源共享,后端处理,本质就是在响应头中加入了固定的头通过浏览器的拦截即可
在utils中编写中间件文件 common_middle
from django.utils.deprecation import MiddlewareMixin
# 编写中间件需要解除的类
class CorsMiddleWare(MiddlewareMixin):
def process_response(self,request,response):
if request.method=="OPTIONS":
# 解决非简单请求的请求头
#请求头里可以加任意数据 *
response["Access-Control-Allow-Headers"]="*"
# 允许前端的地址,所有请求头允许
response["Access-Control-Allow-Origin"] = "*"
return response
把编写的中间件注册到django 中间件中即可
标签:浏览器,跨域,中间件,问题,简单,解决,response,请求
From: https://www.cnblogs.com/moongodnnn/p/17165795.html