一、同源策略

  同源策略(Same origin policy) 是一种约定, 它是浏览器最核心也是最基本的安全功能 , 如果缺少了同源策略, 则浏览器的正常功能可能都会受影响 , 可以说web是构建在同源策略基础值上的, 浏览器只是针对同源策略的一种实现.

  同源策略, 它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。看如下示例:

  创建一个Django 项目一:

============= http://127.0.0.1:8000项目的index
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
</head>
<body> <button>ajax请求</button> <script>
$('button').click(function () { $.ajax({
url: 'http://127.0.0.1:8008/books/',
type: 'get',
success: function (res) {
console.log(res)
}
}) })
</script> </body>
</html> ============= http://127.0.0.1:8000项目的views
from django.shortcuts import render def index(request):
return render(request, 'index.html')

创建一个Django项目二 :

============= http://127.0.0.1:8008项目的index
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
</head>
<body> <button>ajax请求</button> <script>
$('button').click(function () { $.ajax({
url: '/books/',
type: 'get',
success: function (res) {
console.log(res)
}
}) })
</script> </body>
</html> ============= http://127.0.0.1:8008项目的views
from django.shortcuts import render
from django.http import JsonResponse def index(request):
return render(request, 'index.html') def books(request):
return JsonResponse(['s2-python', 's2-java'], safe=False)

  当点击项目二的按钮时, 可以正常发送并请求到数据, 但是点击项目一的按钮时, 页面控制台会报如下错误:

Access to XMLHttpRequest at 'http://127.0.0.1:8008/books/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

  但是注意 : 项目二中的访问已经发生了, 说明是浏览器对同源请求返回的结果做了拦截,

  解决方式 , 项目二views 的books 函数修改如下 :

def books(request):

    obj = JsonResponse(['s2-python', 's2-java'], safe=False)
obj['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' return obj

二、CORS

  CORS需要浏览器和服务器同时支持, 目前, 所有浏览器 都支持该功能,IE浏览器不能低于IE10。

  整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

  因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

  浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

  只要同时满足以下两大条件,就属于简单请求。

(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

   支持跨域, 简单请求:

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

   支持跨域 , 复杂请求 :

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

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

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

同源策略、CORS的更多相关文章

  1. 同源策略 , CORS

    一 . 同源策略 同源策略( Same origin policy ) 是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响,可以说Web是构建在同源 ...

  2. [CORS:跨域资源共享] 同源策略与JSONP

    Web API普遍采用面向资源的REST架构,将浏览器最终执行上下文的JavaScript应用Web API消费者的重要组成部分."同源策略"限制了JavaScript的跨站点调用 ...

  3. Apache2 同源策略解决方案 - 配置 CORS

    什么是同源策略 现在的浏览器大多配有同源策略(Same-Origin Policy),具体表现如下: 浏览某一网站,例如 http://www.decembercafe.org/.这个网页中的 Aja ...

  4. 关于安全性问题:(XSS,csrf,cors,jsonp,同源策略)

    关于安全性问题:(XSS,csrf,cors,jsonp,同源策略) Ajax 是无需刷新页面就能从服务器获取数据的一种方法.它的核心对象是XHR,同源策略是ajax的一种约束,它为通信设置了相同的协 ...

  5. 同源策略 & 高效调试CORS实现

    # 目录 为什么有同源策略? 需要解决的问题 CORS跨域请求方案 preflight withCredentials 附:高效.优雅地调试CORS实现 ----------------------- ...

  6. 浏览器的同源策略及CORS跨域解决方案 DRF

    一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: UR ...

  7. 同源策略jsonp和cors

    同源策略: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...

  8. AJAX_违反了同源策略_就是"跨域"——jsonp 和 cors

    https 协议    默认端口号 443 http 协议    默认端口号 80 同源策略 由网景公司提出的——浏览器 的 为了浏览器安全而生 同源策略: 协议.域名.端口号    必须完全一致 违 ...

  9. 同源策略与CORS

    同源策略 同源策略是浏览器保护用户安全上网的重要措施,协议.域名.端口号三者相同即为同源. 不同源下,浏览器不允许js操作Cookie.LocalStorage.DOM等数据或页面元素,也不允许发送a ...

随机推荐

  1. Nodejs下express+ejs模板的搭建

    nodejs的环境配置,这里就不做说明了.在nodejs安装后的步骤在这里说明一下 首先 全局安装express  npm install -g express-generator 安装ok后,接着 ...

  2. ubuntu安装lua5.3.2

    lua5.3要自主编译安装 1.获取源:weget http://www.lua.org/ftp/lua-5.3.2.tar.gz 2.解压:tar -zxf lua-5.3.2.tar.gz 3.编 ...

  3. VS 编译太慢了吗?新建解决方案配置关闭一部分项目的编译

    手头的解决方案真大!里面的项目个数达到了 30 个或是 50 个?然而接近一半是单元测试项目和辅助工具.再加上一些不尽如人意的项目优化,编译速度真的是无力吐槽.幸好 Visual Studio 提供了 ...

  4. Tornado之实例和扩展

    1.Tornado文件的结构: 1.Controllers控制器 2.Models数据库操作 3.Views前端显示 2.样例 #!/usr/bin/env python # -*- coding: ...

  5. ambassador kubernetes native api gateway

    github 上的介绍: Ambassador is an open source Kubernetes-native API Gateway built on Envoy, designed for ...

  6. php、打印

    <!DOCTYPE HTML><html><head><meta http-equiv="content-type" content=&q ...

  7. 纯 as3 项目中引用 fl 包下的类

    如果安装了 Flash IDE, 将下面的文件添加到项目的 libs 中即可:D:\Program Files\Adobe\Adobe Flash CS6\Common\Configuration\A ...

  8. geohash 精度

    关于地图的距离.  $list1=Db::name('museum')->where('id','in',$user['gz'])->order('ACOS(SIN(('.$lat.' * ...

  9. Java API 操作 Mongodb

    本次测试环境使用一台ip为 192.168.2.23 的虚拟机 一.依赖 <dependency> <groupId>org.mongodb</groupId> & ...

  10. saiku3.8二次开发项目搭建(非maven)

    参考文章:http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文,这里只是做一个记录,由于本人maven能力有限, ...