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"

      

最新文章

  1. easyui-conbotree树形下拉框。。。转
  2. Core Data使用
  3. hdu 4784 Dinner Coming Soon(spfa + 优先队列)
  4. laravel 控制器里 redirect url地址传两个参数的方法
  5. FFT一周目开坑!
  6. MDX : Non Empty v/s NonEmpty
  7. VS2010 创建WindowsService服务
  8. Android开发系列之调用WebService
  9. linux 使用外部设备的(光盘) 安装和更新库
  10. 转:JMeter 参数化之利用JDBC Connection Configuration从数据库读取数据并关联变量
  11. 客户端和服务端(C#) 时间戳的生成和转换
  12. Odoo / PS Cloud12版本中,产品变体功能如何使用
  13. Shell 有类型变量
  14. [maven] dependency标签理解
  15. npm 是干什么的
  16. Postman接口测试_添加断言
  17. 【19】Linux系统知识点
  18. 【洛谷P4097】Segment 李超线段树
  19. Unity3D 中的面向对象设计 {游戏对象(创建、删除、获取),以及添加修改组件}
  20. 《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)

热门文章

  1. Hadoop记录-技术网站
  2. Github/github 初始化教程
  3. SpringBoot系列: 极简Demo程序和Tomcat war包部署
  4. Windows环境手动DOS命令构建apk文件
  5. Unicode与UTF8
  6. 关于TCP/IOCP构架中出现的Socket假死连接解决方案
  7. 面向对象 ( OO ) 的程序设计——创建对象
  8. datatable转换为list<model> 映射
  9. remove() 方法
  10. 第26月第23天 nsobject 单例 CFAbsoluteTimeGetCurrent