DRF 跨域问题

【一】说明

  • CORS(跨来源资源共享,Cross-Origin Resource Sharing)是一种浏览器技术的规范,旨在解决浏览器同源策略(Same-Origin Policy)的限制,使得Web服务可以从不同的网域(源)安全地加载资源。

(1)浏览器同源策略

  • 同源策略是浏览器的一种安全机制,用于限制在浏览器中加载的文档或脚本如何与不同源(协议、域名和端口)的资源进行交互。具体来说,当一个页面加载了来自特定源的资源后,该页面只能与同源的资源进行交互,而无法直接访问其他源的资源。
    • 地址:指的是域名或IP地址。
    • 端口:HTTP默认端口是80,HTTPS默认端口是443。如果端口不同,即使域名和协议相同,也视为不同源。
    • 协议:HTTP和HTTPS是两种不同的协议,即使域名和端口相同,协议不同也视为不同源。

(2)CORS 跨域资源共享

  • CORS是一种机制,允许服务器在响应中设置一些特殊的HTTP头部,以授权其他域名下的页面访问自己的资源。这样,就可以绕过浏览器的同源策略限制,实现跨域资源共享。
  • CORS需要浏览器和服务器同时支持。对于浏览器来说,只要支持CORS的浏览器(如现代浏览器都支持,IE浏览器不能低于IE10),在发现AJAX请求跨源时,会自动添加一些附加的头信息(如Origin字段),有时还会多出一次附加的请求(预检请求,Preflight Request),但用户不会有感觉。
  • 对于服务器来说,只要服务器实现了CORS接口(即在响应中设置了正确的CORS头部),就可以允许跨源通信。具体来说,服务器会在响应头部中添加一些CORS相关的字段,如Access-Control-Allow-Origin,来指定哪些源可以访问该资源。

(3)CORS请求的分类

  • 浏览器将CORS请求分成两类:简单请求(Simple Request)和非简单请求(Not-So-Simple Request)。
    • 简单请求:只要同时满足以下两大条件,就属于简单请求:
      • 请求方法是HEAD、GET、POST三者之一
      • HTTP的头信息不超出Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)这几种字段。
    • 非简单请求:不同时满足简单请求条件的请求都属于非简单请求。对于非简单请求,浏览器会先发出一个预检请求(Preflight Request),询问服务器是否允许该跨域请求。如果服务器在预检请求的响应中同意了该请求,浏览器才会发出实际的CORS请求。

【二】方法一:自定义

(1)自定义中间件

from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):def process_response(self,request,response):# options请求就是非简单请求的预检请求if request.method=="OPTIONS":response["Access-Control-Allow-Headers"]='Content-Type, *'  # 注意:通常不建议使用 '*',应该明确列出允许的头response['Access-Control-Allow-Methods'] = 'GET, POST, PUT, PATCH, DELETE, OPTIONS'response['Access-Control-Max-Age'] = 86400  # 预检请求的缓存时间(秒)response["Access-Control-Allow-Origin"] = "*" # 注意:'*' 允许所有来源,但出于安全考虑,建议使用具体的来源  return response
  • 注意
    • 在生产环境中,通常不建议将 Access-Control-Allow-Origin 设置为 *,因为这可能会降低安全性。您应该将其设置为特定的源,如 'https://example.com'
    • Access-Control-Allow-Headers 也不应设置为 *,除非您确实希望允许所有头。通常,您应该明确列出您希望允许的头,如 'Content-Type, X-Requested-With'

(2)添加到配置文件

MIDDLEWARE = [# ... 其他中间件 ...  '自定义中间位置.CorsMiddleWare',# ... 其他中间件 ...  
]

【三】方法二:第三方

(1)使用pip安装

pip install django-cors-headers

(2)注册app

  • 在Django项目的 settings.py 文件中,将 'corsheaders' 添加到 INSTALLED_APPS 列表中。
INSTALLED_APPS = (  ...  'corsheaders',  ...  
)

(3)添加到中间件

  • settings.py 文件的 MIDDLEWARE 列表中,确保 'corsheaders.middleware.CorsMiddleware' 出现在其他中间件之前,但位于 'django.middleware.security.SecurityMiddleware' 之后(如果你使用了它)。
MIDDLEWARE = [  ...  'django.middleware.security.SecurityMiddleware',  'corsheaders.middleware.CorsMiddleware',  ...  
]

(4)配置CORS设置

  • settings.py 文件中,配置CORS相关的设置。
CORS_ORIGIN_ALLOW_ALL = True  # 如果设置为True,则允许所有源进行跨域访问  
CORS_ALLOW_METHODS = (  'DELETE',  'GET',  'OPTIONS',  'PATCH',  'POST',  'PUT',  
)  
CORS_ALLOW_HEADERS = (  'accept-encoding',  'authorization',  'content-type',  'dnt',  'origin',  'user-agent',  'x-csrftoken',  'x-requested-with',  
)  # 如果希望允许携带凭证(如cookies、HTTP认证及客户端SSL证明等)的跨域请求  
# 需要设置以下两个配置,并且CORS_ORIGIN_ALLOW_ALL 必须为False,同时指定具体的源  
# CORS_ALLOW_CREDENTIALS = True  
# CORS_ORIGIN_WHITELIST = (  
#    'http://example1.com',  
#    'http://example2.com',  
#    ...  
# )

(5)源码简单分析

image-20240515093139158

  • 检查是否允许所有源
    • 如果 CORS_ORIGIN_ALLOW_ALL 设置为 True 并且 CORS_ALLOW_CREDENTIALS 没有设置为 True(因为携带凭证的请求不允许使用 * 作为 Access-Control-Allow-Origin 的值),则中间件会将 Access-Control-Allow-Origin 设置为 *
  • 处理OPTIONS请求
    • 当接收到 OPTIONS 请求时(即预检请求),中间件会根据 CORS_ALLOW_METHODSCORS_ALLOW_HEADERS 的设置来设置相应的响应头 Access-Control-Allow-MethodsAccess-Control-Allow-Headers
  • 可以发现自定义中间件就是简化的这部分代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

error Error: certificate has expired

用yarn命令安装依赖的时候遇到报错: 原因:可能是开了服务器代理访问导致ssl安全证书失效 解决方法: 在终端输入 yarn config set "strict-ssl" false -g yarn config set "strict-ssl" false -g 然后再安装依赖就不…

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能:模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围:1.8V ~ 5…

【C语言】6.C语言VS实用调试技巧(1)

文章目录 1.什么是 bug2.什么是调试(debug)?3.Debug 和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5.监视和内存观察5.1 监视5.2 内存 1.什么是 bug bug现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题…

Git使用(3):版本管理

一、查看历史 编写一个java类进行测试 选择Git -> Show Git Log查看日志。 第一次修改推送到远程仓库了,所以有origin(远程仓库地址),第二次修改只提交到本地仓库所以没有。 二、版本回退 1、本地回退 在要回退的版本上右键&a…

XLSX文件删除了怎么找回?8个恢复方法,太实用了!

U盘作为一种便携的存储设备,随之而来的数据丢失问题也让人头疼。尤其是当U盘中的XLSX文件(Excel 2007及以后版本的默认文件格式)被误删除或丢失时,如何高效找回这些数据成为了许多人关注的焦点。 本文将从XLSX文件的特性、U盘格式…

深度盘点在当今经济形势下资深项目经理或PMO的或去或从

在当今经济形势下,资深项目经理(Project Manager)或项目管理办公室(PMO)的去向和选择受到多种因素的影响。以下是对他们可能面临的或去或从的深度盘点: 1、发展去向 1. 深化专业领域:在经济形势…

Linux程序开发(一):Linux基础入门安装和实操手册

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

Java面试八股之Java中有哪些原子类,原理是什么

Java中有哪些原子类,原理是什么 AtomicInteger 和 AtomicLong: 用于对整数(int)和长整数(long)进行原子操作。 原理:它们内部封装了一个整型或长整型变量,并通过使用Unsafe类提供…

OpenHarmony 实战开发——ArkUI容器类API介绍

容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。在 ArkUI 开发框架中,容器类采用了类似静态的语言来实现,并通过 NAPI 框架对外提供。通过对存储位置以及属性的限制&#x…

C++map容器关联式容器

Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的&#xff0…

【开发】模型部署笔记

目录 模型量化 模型量化 1、模型量化优点 低精度模型表示模型权重数值格式为FP16(半精度浮点)或者INT8(8位定点整数),但是目前低精度往往就指代INT8。常规精度模型则一般表示模型权重数值格式为FP32(32位…

策略模式详解

策略模式 1 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进…

gitlab webhook触发jenkins任务

配置jenkins 安装gitlab插件 配置jenkins job 选择gitlab webhook触发 在高级中生成token 代码仓设置 新增webhook 配置webhook 测试连接 缺点,不能带gitLab事件的参数!!!

Spark RDD案例:统计网站每月访问量

这个项目利用Spark技术,通过统计网站访问记录中的日期信息,实现了对每月访问量的统计和排序。通过分析数据,我们可以了解到不同月份的网站访问情况,为进一步优化网站内容和推广策略提供数据支持。 使用Spark统计网站每月访问量 …

Apache2.4和PHP8的量子纠缠

Apache不建议你用,PHP建议使用

一种基于电场连续性的高压MOSFET紧凑模型,用于精确表征电容特性

来源:A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance(TED 24年) 摘要 本文提出了一种新的高压MOSFET(HV MOS)紧凑模型,以消…

【hana】hana1.0多容器常用命令

基础命令 数据库 连接数据库 hdbsql -u system -p {passwd} -i 02 -d {dbname}查询所有数据库 SELECT DATABASE_NAME, ACTIVE_STATUS FROM M_DATABASES;停止数据库,会修改数据库状态为No ALTER SYSTEM STOP DATABASE testdb; 启动数据库,会修改数据…

多线程的代码案例

目录 单例模式 饿汉模式 懒汉模式 阻塞队列 生产者消费者模型意义: 阻塞队列使用方法 实现阻塞队列 阻塞队列实现生产者消费者模型 定时器 实现简单的定时器 工厂模式 线程池 为啥呢? 从池子里面取 比 创建线程 效率更高 线程池的创建 怎么填坑 ThreadPoolExec…

图解堆排序【一眼看穿逻辑思路】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 目录 1、堆的概念2、实现堆排序前的准备工作3、堆排序的思路3.1 第一步3.2 第二步 4、结语 1、…