1.  Jquery 对象可以通过 .index() 进行取出自当前元素在父级元素中存放的索引;

2. 浏览器的同源策略 -- Ajax 在访问非本网站的时候,在数据返回的时候,会被浏览器拦截

   - 后端使用 requests 获取数据后,发送给前端

   - jsonp 在前端页面中, 带有 src 属性的标签不受同源策略的影响(img, script, iframe等),我们可以通过使用 script 标签来获取内容,但 script 中 src 获取内容后,获得到的字符串(类似于调用python中的 eval 或 exec)会被 JS 执行,所以我们可以定义一个函数,然后让服务端返回的内容外面包裹一层这个函数名,前端在访问的时候把这个函数名发送过去,并提前定义好该函数

手动实现:

服务端返回的数据

def server(request):

    return HttpResponse("aaa('important data!!!')")

客户端定义及获取数据

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Client</title>
<script src="/static/jquery-3.2.1.js"></script>
<script>
$(function(){ }); var url = 'http://127.0.0.1:8000/server.html/'; // 服务端路径
var $script; // 模拟使用创建的标签名
function aaa(data){ // 数据返回后用来接收的函数
alert(data);
document.head.removeChild($script); // 接收完数据后,从页面删除刚才使用的标签
}
function getInfo(){
$script = document.createElement("script"); // 创建一个 script 标签
$script.setAttribute("src", url); // 将需要请求数据的地址放入 script 的 src 中
document.head.appendChild($script); // 将标签放入到 head 中 } </script>
</head>
<body>
<h1>Client</h1>
<input type="button" onclick="getInfo()" value="getInfo">
</body>
</html>

通过JSONP自动完成 - 上面是它的原理

 服务端返回的数据

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse def server(request):
# 根据后端发送过来的名字来决定返回时,数据外面套的内容
funcName = request.GET.get("callback")
return HttpResponse("%s('important data!!!')"%funcName)

  客户端定义及获取数据

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Client</title>
<script src="/static/jquery-3.2.1.js"></script>
<script>
function bbb(data){
alert(data);
} $(function(){
var url = 'http://127.0.0.1:8000/server.html/'; // 服务端路径
$.ajax({
url: url, // 跨站请求数据的路径
type: 'GET', // 发送方式为 get, 由于使用的是 script, 所以只支持 get
dataType: 'JSONP', // 使用 JSONP 方式
jsonp: 'callback', // get 发送的时候,后面跟的数据名为 callback
jsonpCallback: 'bbb' // get 发送数据的callback的值为 bbb
})
}); </script>
</head>
<body>
<h1>Client</h1>
<input type="button" value="getInfo">
</body>
</html>

cors - 跨域资源共享 cross origin resource sharing

随着技术的发展,现在的浏览器可以支持主动设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

  cors 分为简单请求和非简单请求,简单请求只发送一次,直接发送数据,非简单请求则会发送两次数据,第一次发送 opption 请求(预检),为的是查看真正的数据是否可以被接收(数据头和请求方式是否符合要求), 如果符合要求,服务端可以把内容加入到头文件中来告诉浏览器;

简单请求与非简单请求

条件:
1、请求方式:HEAD、GET、POST
2、请求头信息:
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

  

简单请求:在使用cors的时候,客户端几乎不用修改,只需要按照普通的ajax的请求方式发送,在服务端返回数据的时候,只要在返回的时候,加上一个响应头就可以解决这个问题了

def example(request):
response = HttpResponse("返回的数据内容")
response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8888" # 允许访问获取信息的域名
return response

  服务器设置响应头:Access-Control-Allow-Origin = '域名' 或 '*',允许访问获取信息的域名,如果后面是*的话,代表允许所有的请求,如果需要每一个相应都设置该响应头的话(即这个网站的所有资源都可以被其它域名的所访问,那么我们可以在中间件中设置这个响应头);

对于复杂请求,会先发一次预检(OPTIONS)请求,如果服务端允许,那么再发送一次正式请求(如PUT等,总之就是正真的请求),这个时候,我们需要在后端进行判断,如果允许用户获取数据,那么当预检(OPTIONS)过来的时候,我们需要返回允许访问的请求:Access-Control-Allow-Methds

if request.method == "OPTIONS":
response = HttpResponse() // 返回的内容可以为空,主要需要返回请求头
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Methods'] = 'PUT' # 允许的复杂请求方式为 PUT 请求;如果多个,用逗号分隔, "PUT, DELETE"
response['Access-Control-Allow-Headers'] = "k1" # 复杂请求还有一种情况就是定制请求头,这种情况下,我们在返回的相应中应该设置该响应头,代表允许发送请求头的key是什么,如果多个,逗号分隔 "k1, k2"
return response

  如果我们不想每次都经过“预检”这个环节的话,那么我们可以在服务器的响应头中增加一组:Access-Control-Max-Age的响应头,可以写成

response['Access-Control-Allow-Headers'] = 10  # 默认单位为秒

  

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
<script src="/static/jquery-3.2.1.js"></script>
<script>
$(function(){
$("#btn01").click(function(){
$.ajax({
url: "http://127.0.0.1:8000/btn01/",
success: function(data){
console.log(data)
}
})
}); $("#btn02").click(function(){
$.ajax({
url: "http://127.0.0.1:8000/btn02/",
type: "PUT",
success: function(data){
console.log(data)
}
})
}); $("#btn03").click(function(){
$.ajax({
url: "http://127.0.0.1:8000/btn03/",
headers: {"k1": "asdfasdf"},
success: function(data){
console.log(data)
}
})
})
})
</script>
</head>
<body>
<p><input type="button" value="简单请求" id="btn01"></p>
<p><input type="button" value="复杂请求-PUT" id="btn02"></p>
<p><input type="button" value="复杂请求-Headers" id="btn03"></p>
</body>
</html>

简单和复杂请求的客户端代码

 from django.shortcuts import render
from django.http import HttpResponse # Create your views here.
def btn01(request):
response = HttpResponse("btn01")
response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8888"
return response def btn02(request):
if request.method == "OPTIONS":
response = HttpResponse()
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Methods'] = 'PUT'
return response if request.method == "PUT":
response = HttpResponse("btn02")
response['Access-Control-Allow-Origin'] = '*'
return response def btn03(request):
if request.method == "OPTIONS":
response = HttpResponse()
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Headers'] = "k1"
return response if request.method == "GET":
response = HttpResponse("btn03")
response['Access-Control-Allow-Origin'] = '*'
return response

简单和复杂请求的服务端代码

携带cookie的传输

如果在使用Ajax请求的时候,需要传递cookie的时候,我们则需要在发送ajax的时候,以及服务器给我们相应的时候加上一组头信息

客户端需要加:XMLHttpRequest的withCredentials为true

$.ajax({
url: "http://c2.com:8000/test/",
type: 'PUT',
dataType: 'text',
headers: {'k1': 'v1'},
xhrFields:{withCredentials: true}, // 加在了这里
success: function(data, statusText, xmlHttpRequest){
console.log(data);
}
})

  

服务端需要加:Access-Control-Allow-Credentials为true

class MainHandler(tornado.web.RequestHandler):

    def put(self):
self.set_header('Access-Control-Allow-Origin', "http://www.xxx.com")
self.set_header('Access-Control-Allow-Credentials', "true") # 加在了这里 self.set_header('xxoo', "seven")
self.set_header('bili', "daobidao")
self.set_header('Access-Control-Expose-Headers', "xxoo,bili") self.set_cookie('kkkkk', 'vvvvv'); self.write('{"status": true, "data": "seven"}') def options(self, *args, **kwargs):
self.set_header('Access-Control-Allow-Origin', "http://www.xxx.com")
self.set_header('Access-Control-Allow-Headers', "k1,k2")
self.set_header('Access-Control-Allow-Methods', "PUT,DELETE")
self.set_header('Access-Control-Max-Age', 10)

  

http://www.cnblogs.com/wupeiqi/articles/5703697.html

3. 模拟点击事件

$("#a").trigger("chick"); // 模拟执行 id=a 的事件

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

  1. 同源策略jsonp和cors

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

  2. Django 之Ajax&Json&CORS&同源策略&Jsonp用法

    什么是Json 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集 ...

  3. 同源策略与CORS

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

  4. Cross-origin resource sharing JSON with Padding 同源策略 JSONP 为什么form表单提交没有跨域问题,但ajax提交有跨域问题? XMLHttpRequest and the Fetch API follow the same-origin policy 预检请求(preflight request)

    https://zh.wikipedia.org/wiki/跨来源资源共享 跨来源资源共享(CORS)是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略[1 ...

  5. [oldboy-django][2深入django]浏览器同源策略 + JSONP + cros

    浏览器的同源策略: - 同源: 同方法,同域名,同端口 http://www.baidu.com:8000 http: 方法 www.baidu.com: 域名 8000: 端口 - 定义 网上解析非 ...

  6. 同源策略 JSONP(实践篇)

    JSONP详解 json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. ...

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

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

  8. 同源策略、CORS

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

  9. 同源策略与CORS跨域请求

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

随机推荐

  1. JavaSE---基本数据类型存储大小

  2. PHP filter_list() 函数

    定义和用法 filter_list() 函数返回包含所有得到支持的过滤器的一个数组. 语法 filter_list() 提示和注释 注释:该函数的结果不是过滤器 ID,而是过滤器名称.请使用 filt ...

  3. java中循环删除list中元素的方法

    重点哈 印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接 ...

  4. mysql学习-explain

    表头包含有: id---select_type---table---type---possible_keys---key---key_len---ref---rows---Extra id:selec ...

  5. centos下安装java jdk1.8

    ---恢复内容开始--- mysql密码修改了,发现还没装jdk,那就一起记录下来吧.虽然网上好多,但自己想查更方便了. 查看有没有装jdk #java -version显示下面信息,不是oracle ...

  6. thinkphp 根据文件后缀的不同返回不同的结果

    ** * 根据文件后缀的不同返回不同的结果 * @param string $str 需要判断的文件名或者文件的id * @return integer 1:图片 2:视频 3:压缩文件 4:文档 5 ...

  7. 服务器一般达到多少QPS比较好?

    每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量. 原理:每天80%的访问集中在20%的时间里,这20%时 ...

  8. kvm无人值守安装centos 7虚拟机

    centos 7安装好KVM之后还要安装虚拟机,通过VNC连接手动安装centos 7虚拟机太麻烦了,所以无人值守安装是做好的.简单记录下. 无人值守安装centos 7前提是要安装KVM,并且能手动 ...

  9. Linux终端提示符颜色设置

    将以下语句添加到用户目录下的 .bashrc 文件中,然后执行 source .bashrc 使其立即生效. PS1='${debian_chroot:+($debian_chroot)}\[\033 ...

  10. js上传图片到七牛云存储

    项目开发过程中遇到一个需求,运营人员需要上传图片到七牛云,最开始的做法是,后台对接七牛,然后出一个接口,前端调用接口,先将图片传到后台,然后后台再上传七牛云,用的过程中发现,图片小的情况下还好,图片一 ...