同源策略

同源策略是浏览器的一个安全策略,只允许当前页面或当前域下发送请求,如果向其他域发送请求,会被浏览器拦截

同源的意思:协议、IP地址、端口三者一致,浏览器才会认为是同一个域,三者中有一个不一致就是不同域

实例:比如说我们要通过127.0.0.1:8001/test/中的一个点击事件,提交一个ajax请求,要去拿127.0.0.1:8010/test2/的返回数据,这时候就会遇到一个问题——跨域资源共享的问题,程序的报错信息如下:

Access to XMLHttpRequest at 'http://127.0.0.1:8010/test2/' from origin 'http://127.0.0.1:8001' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
# CORS策略已阻止从源站“http://127.0.0.1:8001”访问位于“http://127.0.0.1:8010/test2/”的xmlhttpRequest:请求的资源上不存在“访问控制允许源站”头

views.py(该程序运行的网址为http://127.0.0.1:8010/test2

from django.shortcuts import render, HttpResponse


def test2(request):
return HttpResponse('这是另一个网站地址')

127.0.0.1:8001/test/中通过ajax向127.0.0.1:8010/test2/发送GET请求,其实数据已经被拿回来了,报错的原因就是返回的数据被浏览器拦截了,这就是跨域问题的本质。那如何解决这个问题,最简单的处理方法就是在被ajax请求访问的视图函数返回的时候让它带上一个参数:response['Access-Control-Allow-Origin'] ='http://127.0.0.1:8001'

将8010端口运行的views.py做如下修改

def test2(request):
response = HttpResponse('这是另一个网站地址')
# 只允许一个域
response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8001'
# 允许所有的域
# response['Access-Control-Allow-Origin'] = '*'
return response

这时候再去通过ajax访问127.0.0.1:8010/test2/网站就不会报错了!执行效果如下:

其实,CORS有两种请求方式,以上处理的这只是简单请求

简单请求与非简单请求

简单请求必须满足的条件

# 1、请求方法是以下一种:
GET
POST
HEAD
# 2、http的头信息不超出以下几种:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:application/x-www-form-urlencoded、multipart/form-data、text/plain # 只限于这三个值

除了以上的所有出现的信息都是非简单请求!

那针对不同的请求会有不同的解决方法,所谓的简单请求就是只发送一次请求,而非简单请求是发送两次请求,在发送数据之前会先发一次请求用于做“预检(OPTIONS)”,只有“预检”通过后才再发送一次请求用于数据传输

预检

请求方式:OPTIONS

“预检”其实是做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息

如何“预检”

如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过

Access-Control-Request-Method

如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过

Access-Control-Request-Headers

简单请求支持跨域

服务器设置响应头:Access-Control-Allow-Origin = '域名' 或 '*'

非简单请求支持跨域

由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。

  • “预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
  • “预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers

在Django中解决CORS问题

可以通过上述方法在返回的结果中添加允许信息来解决简单请求,还可以在Django的中间件中处理简单请求和非简单请求

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"] = "允许访问的URL"
return response

  

跨域资源共享(CORS)的更多相关文章

  1. 跨域资源共享(CORS)问题解决方案

    CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下:Chrome 3+.IE 8+.Firefox 3.5+.Opera 12+. ...

  2. 跨域资源共享CORS与JSONP

    同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...

  3. 跨域解决方案 - 跨域资源共享cors

    目录 1. cors 介绍 2. 原理 3. cors 解决跨域 4. 自定义HTTP 头部字段解决跨域 5. 代码演示 5. 参考链接 1. cors 介绍 cors 说的是一个机制,其实相当于一个 ...

  4. VUE SpringCloud 跨域资源共享 CORS 详解

    VUE  SpringCloud 跨域资源共享 CORS 详解 作者:  张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...

  5. 网络编程-跨域资源共享 CORS

    目录 1.什么是同源策略? 2.跨域资源共享 CORS 3.预检请求 4.CORS相关字段 5.Golang实现跨域 6.参考资料 1.什么是同源策略? 如果两个 URL 的 protocol.por ...

  6. 跨域资源共享 CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  7. 跨域资源共享 CORS 详解

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  8. 使Web Api 支持跨域资源共享(CORS)

    Reference:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api Imp ...

  9. 跨域资源共享CORS详解

    简介 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请 ...

  10. 跨域资源共享 CORS 详解(转)

    add by zhj: 公司在一个web产品上,做前后端分离,前后端提供独立的服务,使用不同的域名,通过http进行交互,在 前端,会涉及到跨域访问的问题,前端使用了CORS,后端同时需要做相应修改, ...

随机推荐

  1. Linux几大服务

    server0操作: 1.创建/devops目录,并修改其SELINUX安全上下文 # mkdir /devops # vim /devops/1.mp3# chcon -R -t samba_sha ...

  2. 第一章 Python基本语法元素

    1.1   程序设计基本方法 计算机的概念: (1)功能性:对数据的操作,表现为数据计算.输出输出处理和结果存储等 (2)可编程性:根据一系列指令自动地.可预测地.准确地完成操作者的意图. 计算机的发 ...

  3. React多层级表单

    因项目需要封装的组件,组件库使用的是Ant Design 用到了 Form组件 , 布局组件,表单控件 ,如果没有使用Ant Design,可以用rc-form代替,需要对组件中使用的表单控件和布局进 ...

  4. SPFA求最短路——Bellman-Ford算法的优化

    SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE), ...

  5. Heap Partition ZOJ - 3963(贪心)

    ZOJ - 3963 贪心做一下就好了 反正别用memset #include <iostream> #include <cstdio> #include <sstrea ...

  6. 【BZOJ2721】樱花(数论)

    [BZOJ2721]樱花(数论) 题面 BZOJ 题解 先化简一下式子,得到:\(\displaystyle n!(x+y)=xy\),不难从这个式子中得到\(x,y\gt n!\). 然后通过\(x ...

  7. 2019余姚培训游记+ZJOJD2划水记

    2019余姚培训游记 突然就想写一个... 注意:以下全是胡言乱语的自high,还有很多错别字 Day 0 来的比较早,早上就到了 上午把一本小说看完了,是一个年轻作者的处女作. 我觉得我第一本书一定 ...

  8. CF1114D 【Flood Fill】

    Solution 一看就是很水的区间DP \(dp[i][j]\)表示区间\([l,r]\)都涂成同色的代价. \(dp[i][j] = min( dp[i][j], dp[i][k] + dp[k] ...

  9. 【洛谷P2756】飞行员配对方案问题

    题目大意:二分图匹配裸题. 题解:用网络流进行处理. 找配对方案的时候,采用遍历二分图左边的每个节点,找到不与源点相连,且正向边权值为 0,反向边权值为 1 的边,输出即可. 代码如下 #includ ...

  10. 重装系统windows10/8/7,绝对纯净版永久激活的详细步骤和固态硬盘找不到分区的原因

    简介:重装系统有两种: 一种是在线重装,可实现电脑双系统或多系统,也可单系统(重装在另外一个盘,再去格式化系统盘),这种方式比较麻烦,前提电脑能开机使用,但是一般能启动使用也没人去重装系统,但是不需要 ...