跨域问题
浏览器同源策略
它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现,是浏览器对访问到的结果进行了拦截。
请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.
比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险。
跨域资源共享
通过一些办法
允许不同的域去服务器拿数据
首先要知道跨域请求分类
- 简单请求
只要同时满足以下两大条件,就属于简单请求
(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
# 通过预检的方式
=> 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
Access-Control-Request-Method
=> 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
Access-Control-Request-Headers
解决跨域问题
简单请求跨域问题解决
由于在浏览器中的报错信息提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
因此需要为服务器设置响应头:
Access-Control-Allow-Origin = ‘域名’ 或 ‘*’
代码示例
# 被访问的服务端的视图类代码
from rest_framework.views import APIView
from rest_framework.response import Response
class TestView(APIView):
def get(self,request):
print('green_nb')
# 需要在被访问的服务端的response对象中加入'Access-Control-Allow-Origin':'http://127.0.0.1:8002',意思就是当我向http://127.0.0.1:8002发送数据时,对方浏览器允许接收我的数据
return Response('ok',headers={'Access-Control-Allow-Origin':'http://127.0.0.1:8002'})
def post(self,request):
print('green_super_nb')
return Response('ok',headers={'Access-Control-Allow-Origin':'http://127.0.0.1:8002'})
非简单请求跨域问题解决
方案:使用自定义中间件
from django.utils.deprecation import MiddlewareMixin
class CorsMiddleware(MiddlewareMixin):
def process_response(self, request, response):
response['Access-Control-Allow-Origin'] = '*'
if request.method not in ['POST', 'GET']:
response['Access-Control-Allow-Headers'] = 'Content-Type'
return response
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!