CORS(Cross-origin resource sharing) “跨域资源共享”
2024-08-27 18:17:45
CORS与JSONP的比较
在出现CORS标准之前, 我们还只能通过jsonp的形式去向“跨源”服务器去发送 XMLHttpRequest 请求,这种方式吃力不讨好,在请求方与接收方都需要做处理,而且请求的方式仅仅局限于GET。
CORS概念
支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理,对于已经实现CORS接口的服务端,接受请求,并做出回应。其本质是设置响应头,使得浏览器允许跨域请求。
CORS中的跨域请求分为简单请求与非简单请求
简单请求
满足以下条件的就是简单请求
(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
浏览器判断跨域为简单请求时候,会在请求头中添加 Origin (协议 + 域名 + 端口)字段 , 它表示我们的请求源,CORS服务端会将该字段作为跨源标志。
如果想让浏览器接收返回值则需要在响应头中设置
Access-Control-Allow-Origin:表示服务端允许的请求源,*标识任何外域,多个源 , 分隔
浏览器收到Respnose后会判断自己的源是否存在 Access-Control-Allow-Origin允许源中,如果不存在,会抛出“同源检测异常”。
非简单请求
进行非简单请求时候 , 浏览器会首先发出类型为OPTIONS的“预检请求”,请求地址相同 ,
CORS服务端对“预检请求”处理,并对Response Header添加验证字段,客户端接受到预检请求的返回值进行一次请求预判断,验证通过后,主请求发起。
# 因method产生的复杂请求,服务端预检时响应头中添加Access-Control-Request-Method
# 其值是允许的请求方式
# 因请求头产生的复杂请求,服务端预检时响应头中添加Access-Control-Request-Headers
# 其值是允许的请求头的键 # 另外还必须传递Access-Control-Allow-Origin
# 可选项“预检”缓存时间:Access-Control-Max-Age
默认获取到的所有响应头只有基本信息,如果想要获取自定义的响应头,则需要再服务器端设置Access-Control-Expose-Headers。
obj = HttpResponse(result)
obj['Access-Control-Allow-Origin'] = '*'
obj['Access-Control-Expose-Headers'] = "k1"
obj["k1"]="v1"
return obj
# 发送的响应头就会有k1:v1的键,多个键用,隔开
跨域传输cookie
在跨域请求中,默认情况下,HTTP Authentication信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送
如果想要发送:
- 浏览器端:XMLHttpRequest的withCredentials为true
- 服务器端:Access-Control-Allow-Credentials为true
- 注意:服务器端响应的 Access-Control-Allow-Origin 不能是通配符 *
# ajax
$.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);
}
}) # 视图
response_obj['Access-Control-Allow-Credentials']= "true"
最新文章
- easyui-conbotree树形下拉框。。。转
- Core Data使用
- hdu 4784 Dinner Coming Soon(spfa + 优先队列)
- laravel 控制器里 redirect url地址传两个参数的方法
- FFT一周目开坑!
- MDX : Non Empty v/s NonEmpty
- VS2010 创建WindowsService服务
- Android开发系列之调用WebService
- linux 使用外部设备的(光盘) 安装和更新库
- 转:JMeter 参数化之利用JDBC Connection Configuration从数据库读取数据并关联变量
- 客户端和服务端(C#) 时间戳的生成和转换
- Odoo / PS Cloud12版本中,产品变体功能如何使用
- Shell 有类型变量
- [maven] dependency标签理解
- npm 是干什么的
- Postman接口测试_添加断言
- 【19】Linux系统知识点
- 【洛谷P4097】Segment 李超线段树
- Unity3D 中的面向对象设计 {游戏对象(创建、删除、获取),以及添加修改组件}
- 《算法笔记》8.1小节——搜索专题->;深度优先搜索(DFS)