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. Java中volatile如何保证long和double的原子性操作

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11426473.html 关键字volatile的主要作用是使变量在多个线程间可见,但无法保证原子性,对 ...

  2. 使用Ueditor点击上传图片时显示延迟的问题

    最近在做一个项目,需要用到Ueditor,但是在点击上传图片的时候,总是隔了4-5秒才显示文件框 查了一些资料,最后发现,只需在 修改:(1) dialog/images/image.js 把imag ...

  3. nucleus plus代码学习

    int.S: ;************************************************************************ ;* ;* FUNCTION ;* ; ...

  4. 判断系统是否安装了flash插件

    方法1: uses comobj; procedure TForm1.Button1Click(Sender: TObject); var v:variant; begin v:=CreateOleO ...

  5. TI推出一款强大模拟设计与仿真工具TINA-TI 9.

    德州仪器 (TI) 宣布推出一款基于 SPICE 的强大模拟设计与仿真工具 TINA-TI 9.1.该免费软件程序的最新版本与 7.0 版相比速度平均提高 5 倍,可帮助工程师在无任何节点或器件数量限 ...

  6. B2C网站的系统

    管理系统 管理系统:主要做业务上的管理和内容输出,常见的有CMS(内容管理系统).CRM.SCM等, 1 供应商作为第三方,有独立开发的系统(SRM)和IO系统对接.以确定订单的状态.当然IO系统里面 ...

  7. python3迷宫,多线程版

    上图: 直接上代码 #!/usr/bin/python3 #coding=GB2312 import tkinter as tk import threading import time import ...

  8. upc组队赛6 Odd Gnome【枚举】

    Odd Gnome 题目描述 According to the legend of Wizardry and Witchcraft, gnomes live in burrows undergroun ...

  9. MHA+atlas(数据库的高可用与读写分离)

    学习完了mycat的高可用还是复习一下MHA+atlas吧,个人感觉还是比mycat好用,毕竟MHA有数据补全和切换主从的机制 1 MHA是什么? MHA(Master High Availabili ...

  10. activiti7启动流程实例,动态设置assignee人

    package com.zcc.activiti03; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...