ajax跨域原理和cors跨域资源共享
不需要设置前端太多,只需要在服务端是在请求头,使服务端的回复数据可以正常通过浏览器的限制,进入网站
首先说下简单请求和非简单请求:
简单请求:必须满足下列条件
1.请求方式:head,get,post
2.请求头
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:其对应值限制为3个application/x-www-form-urlencoded,multipart/form-data,text/plain
必须同时满足上面的两个条件叫做简单请求
简单请求:跨站请求时只需要一次请求
非简单请求:两次请求,在发送请求之前会先发送一次请求(预检),通过预检的才能再次发送一次请求进行数据传输
一:简单请求
前端:正常设置信息
function CorsAjax(){
$.ajax({
url:'http://www.py_test2.com:8081/cors',
dataType:'text',
data:{},
type:"post",
success:function(data){
console.log(data);
}
})
}
后台服务端(跨域方)需要设置请求头:
#简单请求
def post(self, *args, **kwargs):
self.set_header('Access-Control-Allow-Origin',"http://www.py_test1.com:8080,http://www.py_test1.com:8080")#设置一个或多个都可以,或者加上*代表所有的都允许
self.write('{"status":1,"message":"post"}')
二:复杂请求:需要先发送一次预检
而预检的请求方式为options,所以我们需要在服务端设置一个options请求来处理预检信息
1.当前端的请求方式不满足条件时:
//复杂请求,会发送两个请求,一个options一个put
function CorsAjax2(){
$.ajax({
url:'http://www.py_test2.com:8081/cors',
dataType:'text',
data:{},
type:"put",
success:function(data){
console.log(data);
}
})
}
需要在服务端设置预检
#复杂请求
def options(self, *args, **kwargs):#第一次用于预检
#先允许网站接入
self.set_header('Access-Control-Allow-Origin', "http://www.py_test1.com:8080")
#若是请求方法不满足get,post,head
self.set_header('Access-Control-Allow-Methods',"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
def put(self, *args, **kwargs):#第二次为请求,用于数据传输
self.set_header('Access-Control-Origin','http://www.py_test1.com:8080') #也要设置源地址
self.write('put ok')
2.当客户端请求头也不满足时:
//复杂请求,会发送两个请求,一个options一个put
function CorsAjax2(){
$.ajax({
url:'http://www.py_test2.com:8081/cors',
dataType:'text',
data:{},
type:"put",
headers:{'k1':'ddasf',"k2":'fa'},
success:function(data){
console.log(data);
}
})
}
服务端需要设置关于请求头的信息
#复杂请求
def options(self, *args, **kwargs):#第一次用于预检
#先允许网站接入
#self.set_header('Access-Control-Allow-Origin',"*") # 或者加上*代表所有的都允许
#如果客户端允许传递cookie,那么这里请求头就不能是*,必须是指定的url
self.set_header('Access-Control-Allow-Origin', "http://www.py_test1.com:8080")
#若是请求方法不满足get,post,head
self.set_header('Access-Control-Allow-Methods',"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
#若是请求头也不满足简单请求,也需要设置
self.set_header('Access-Control-Allow-Headers', "k1,k2")#客户端自定义请求头
对于客户端预检可以设置缓存时间,在相应时间内,不会再进行预检
#可以设置缓存时间,原来需要一次预检一次请求,现在只需要一次请求
self.set_header('Access-Control-Max-Age',)#10秒内不再产生预检
对于请求头,若是服务端想要自定义请求都传入客户端:需要进行以下操作
def put(self, *args, **kwargs):#第二次为请求
#服务端自定义响应头
#self.set_header('xxoo','seven')
#self.set_header('bili','daobidao')#这样是客户端无法接收
#还需要设置一条
#self.set_header('Access-Control-Expose-Headers',"xxoo,bili")
3.当客户端允许携带cookie时
需要在客户端设置XMLHttpRequest的withCredentials为true
//复杂请求,会发送两个请求,一个options一个put
function CorsAjax2(){
$.ajax({
url:'http://www.py_test2.com:8081/cors',
dataType:'text',
data:{},
type:"put",
headers:{'k1':'ddasf',"k2":'fa'},
xhrFields:{withCredentials:true},//默认是不允许携带cookie和ssl证书等,需要设置,服务端也要相应设置
success:function(data){
console.log(data);
}
})
}
注意在服务端响应时不允许设置Access-Control-Allow-Origin为通配符*
#若是客户端传递cookie进入,需要设置允许证书等
self.set_header('Access-Control-Allow-Credentials',"true")
完整代码
#复杂请求
def options(self, *args, **kwargs):#第一次用于预检
#先允许网站接入
#self.set_header('Access-Control-Allow-Origin',"*") # 或者加上*代表所有的都允许
#如果客户端允许传递cookie,那么这里请求头就不能是*,必须是指定的url
self.set_header('Access-Control-Allow-Origin', "http://www.py_test1.com:8080")
#若是请求方法不满足get,post
self.set_header('Access-Control-Allow-Methods',"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
#若是请求头也不满足简单请求,也需要设置
self.set_header('Access-Control-Allow-Headers', "k1,k2")#客户端自定义请求头
#若是客户端传递cookie进入,需要设置允许证书等
self.set_header('Access-Control-Allow-Credentials',"true")
#可以设置缓存时间,原来需要一次预检一次请求,现在只需要一次请求
self.set_header('Access-Control-Max-Age',)#10秒内不再产生预检
在第二次请求中:可以设置cookie,并获取
def put(self, *args, **kwargs):#第二次为请求
#由于设置了cookie,所有这里不允许*
#self.set_header('Access-Control-Allow-Origin', "*")
self.set_header('Access-Control-Allow-Origin',"http://www.py_test1.com:8080")
self.set_header('Access-Control-Allow-Credentials',"true")
#为跨域站点设置cookie
print(self.cookies)
self.set_cookie('kk','')
self.write('put ok')
注意第二次请求也是需要设置Access-Control-Allow-Origin的
而且由于cookie的添加需要设置Access-Control-Allow-Credentials
前端完整:
<script>
function CorsAjax(){
$.ajax({
url:'http://www.py_test2.com:8081/cors',
dataType:'text',
data:{},
type:"post",
success:function(data){
console.log(data);
}
})
} //复杂请求,会发送两个请求,一个options一个put
function CorsAjax2(){
$.ajax({
url:'http://www.py_test2.com:8081/cors',
dataType:'text',
data:{},
type:"put",
headers:{'k1':'ddasf',"k2":'fa'},
xhrFields:{withCredentials:true},//默认是不允许携带cookie和ssl证书等,需要设置,服务端也要相应设置
success:function(data){
console.log(data);
}
})
}
服务端完整:
class CorsHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('{"status":1,"message":"get"}') #简单请求
def post(self, *args, **kwargs):
self.set_header('Access-Control-Allow-Origin',"http://www.py_test1.com:8080,http://www.py_test1.com:8080")#或者加上*代表所有的都允许
self.write('{"status":1,"message":"post"}') #复杂请求
def options(self, *args, **kwargs):#第一次用于预检
#先允许网站接入
#self.set_header('Access-Control-Allow-Origin',"*") # 或者加上*代表所有的都允许
#如果客户端允许传递cookie,那么这里请求头就不能是*,必须是指定的url
self.set_header('Access-Control-Allow-Origin', "http://www.py_test1.com:8080")
#若是请求方法不满足get,post
self.set_header('Access-Control-Allow-Methods',"PUT,DELETE")#还可以添加其他,比如DELETE,不能是*
#若是请求头也不满足简单请求,也需要设置
self.set_header('Access-Control-Allow-Headers', "k1,k2")#客户端自定义请求头
#若是客户端传递cookie进入,需要设置允许证书等
self.set_header('Access-Control-Allow-Credentials',"true")
#可以设置缓存时间,原来需要一次预检一次请求,现在只需要一次请求
self.set_header('Access-Control-Max-Age',)#10秒内不再产生预检 def put(self, *args, **kwargs):#第二次为请求
#服务端自定义响应头
#self.set_header('xxoo','seven')
#self.set_header('bili','daobidao')#这样是客户端无法接收
#还需要设置一条
#self.set_header('Access-Control-Expose-Headers',"xxoo,bili") #由于设置了cookie,所有这里不允许*
#self.set_header('Access-Control-Allow-Origin', "*")
self.set_header('Access-Control-Allow-Origin',"http://www.py_test1.com:8080")
self.set_header('Access-Control-Allow-Credentials',"true")
#为跨域站点设置cookie
print(self.cookies)
self.set_cookie('kk','')
self.write('put ok')
更多信息来源可以看此处
简单请求 OR 非简单请求
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
条件: 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注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求 |
ajax跨域原理和cors跨域资源共享的更多相关文章
- Jquery+ajax+json+servlet原理和Demo
Jquery+ajax+json+servlet原理和Demo 大致过程: 用户时间点击,触发js,设置$.ajax,开始请求.服务器响应,获取ajax传递的值,然后处理.以JSON格式返回给ajax ...
- 浅谈跨域问题,CORS跨域资源共享
1,何为跨域? 在理解跨域问题之前,你先要了解同源策略和URL,简单叙述: 1)同源策略 三同:协议相同,域名相同,端口相同: 目的:保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则co ...
- (三)ajax请求不同源之cors跨域
一.基本原理 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨源服务器,发出 XMLHttpReque ...
- jQuery.Ajax IE8,9 无效(CORS跨域)
今天在开发网站的时候,发现一个问题,$.ajax()在 IE8,9 浏览器不起作用,但 Chrome,Firefox ,360,IE10以上等浏览器却是可以的,网上资料很多,查询最后发现是 IE8,9 ...
- JSONP跨域原理和jQuery.getJSON用法
JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式).本文主要介绍JS ...
- ssm框架如果想要跨域请求,cors跨域
<!-- 跨域 --> <mvc:cors> <mvc:mapping path="/**"/> </mvc:cors> 在spri ...
- ajax跨域请求解决方案 CORS和JSONP
什么是跨域: 只要协议.域名.端口有任何一个不同,都会被当成不同的域.而由于浏览器的同源策略(同源策略:域名.协议.端口均相同),浏览器之间要隔离不同域的内容,禁止互相操作,不能执行其他网站的js.所 ...
- Springboot CORS跨域访问
Springboot CORS跨域访问 什么是跨域 浏览器的同源策略限制: 它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础 ...
- 浅谈跨域以及WebService对跨域的支持
跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...
随机推荐
- shell脚本--输入与输出
输出带有转义字符的内容 单独一个echo表示一个换行 使用echo输出时,每一条命令之后,都默认加一个换行:要想取消默认的换行,需要加 -n 参数. #!/bin/bash #文件名:test.sh ...
- Linux标准输入、输出和错误和文件重定向 专题
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆,shell同时也给出了相应的文件名. 下面就是这些文件描述符及它们通常所 ...
- 解决vmware与主机无法连通的问题
我们选择NAT方式,来实现Ubuntu的静态IP地址配置. 打开VMware,在顶部依次选择:编辑 > 虚拟网路编辑器,打开虚拟网路编辑器:去掉VMnet0和VMnet1,只保留VMnet8.然 ...
- OneZero——Review会议(2013.5.20)
1. 时间: 2016年5月20日. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http://www.cnb ...
- delphi的一个公用函数库
delphi的一个公用函数库 {********************************************** *** Name: PublicFunc; *** Author: l ...
- html 背景
用語設置背景的屬性 bgcolor設置背景顏色.可以使用名字.16進制和rgb三種形式的參數: <body bgcolor="#000000"> <body bg ...
- Java代码redis基础操作
maven依赖包: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- Essential Phone PH1原生系统常见问题以及解答
*首先声明原生系统使用Google才是最好的体验. **如果下述问题有更好的解决方法,欢迎各种方式私信我. Q:为什么我的wifi显示无法连接到网络?为什么wifi有x号?如何去掉? A:因为原生系统 ...
- BZOJ3881[Coci2015]Divljak——AC自动机+树状数组+LCA+dfs序+树链的并
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- BZOJ4828 AHOI/HNOI2017大佬(动态规划+bfs)
注意到怼大佬的操作至多只能进行两次.我们逐步简化问题. 首先令f[i][j]表示第i天结束后自信值为j时至多有多少天可以进行非防御操作(即恢复自信值之外的操作).这个dp非常显然.由于最终只需要保证存 ...