同源策略

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

同源的意思:协议、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. dataTable tab栏切换时错位解决办法

    做后台管理类网站肯定要写列表,首选dataTable,功能强大 最近在做一个tab栏切换时发现了一个很诡异的事情:表头错位了! 主要时因为当table被隐藏后,table的header宽度会计算错乱, ...

  2. 仿 ELEMENTUI 实现一个简单的 Form 表单

    原文:仿 ElmentUI 实现一个 Form 表单 一.目标 ElementUI 中 Form 组件主要有以下 功能 / 模块: Form FormItem Input 表单验证 在这套组件中,有 ...

  3. GIt帮助文档之忽略某些文件——忽略python虚拟环境文件夹(转)

    前言:为避免多个Python项目下安装库之间的冲突,或为轻松打包某个项目,建议在每个项目文件夹下安装Python虚拟环境,并在虚拟环境内进行操作,之后你安装的任何库和执行的任何程序都是在这个环境下运行 ...

  4. Go语言中数组

    数组是一个值类型 func ArrayTest1(){ var arryA [3]int = [3]int{1,2,3} //创建一个数组B,将B中第二个元素设置为200 arryB := arryA ...

  5. linux date -s

    修改linux的时间可以使用date指令 修改日期: 时间设定成2009年5月10日的命令如下: #date -s 05/10/2009 修改时间: 将系统时间设定成上午10点18分0秒的命令如下.  ...

  6. 第六周博客作业<西北师范大学|李晓婷>

    1.助教博客链接:https://home.cnblogs.com/u/lxt-/ 2.作业要求链接:https://www.cnblogs.com/nwnu-daizh/p/10569690.htm ...

  7. 1x1的卷积核有什么作用

    信道压缩~跨~信~减 一.1 X 1的卷积核作用 所谓信道压缩,Network in Network是怎么做到的? 对于如下的二维矩阵,做卷积,相当于直接乘以2,貌似看上去没什么意义: 但是,对于下面 ...

  8. Python 几个常见函数

    本文主要总结常见的函数知识点. 1.zip函数 用来并行迭代,可以把两个序列并在一起,然后返回一个元组的列表 names = ['Ann','Jame','Anla'] ages = [11,12,1 ...

  9. wireshark 过滤表达式

    一.针对wireshark最常用的自然是针对IP地址的过滤.其中有几种情况: (1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包.         表达式为:ip.src == ...

  10. DirectX11--实现一个3D魔方(2)

    前言 上一章我们主要讲述了魔方的构造和初始化.纹理的准备工作.目前我还没有打算讲Direct3D 11关于底层绘图的实现,因此接下来这一章的重点是魔方的旋转.因为我们要的是能玩的魔方游戏,而不是一个观 ...