跨域post请求实现方案小结

【名词解释】
跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript
同源策略(注意Network Access这一节):http://www.w3.org/Security/wiki/Same_Origin_Policy

【问题描述】
浏览器出于安全的考量(避免恶意网站轻易读取其他网站显示的内容,因为该内容可能含有敏感信息,想象iframe嵌套银行网页)原则上允许跨域写而限制了跨域读。写是指数据的上行/发送(sending request),读是指数据的下行/接收(receiving response)。(然而跨域写也是很不安全的,容易导致CSRF/clickjacking攻击。浏览器已经限制了跨域读,再限制跨域写的话,那互联网的每个页面都成了孤岛。避免非法跨域写需要用到token,本文不做讨论。)

考虑下述情况:
  1. 指向外部域名的link和通过表单的向外部域发起get请求是一样的,也都是允许的,点击那一刻起,浏览器的当前域名转向了目标网站,也就完全是域内写、读了。
  2. 通过表单向外部域发起post请求也是允许的,理由同上,源网站无法读取目标网站的任何内容。
  3. AJAX(借助XMLHttpRequest对象)跨域get/post是禁止的,因为使用AJAX就是为了读取响应的内容,这触碰了跨域读的限制。
  4. JSONP属于跨域读,且形式限制为get请求,因为它利用了script标签的特性(浏览器认为跨域读脚本是例外,类似的还有img、iframe等等,注意它们共有的src属性)。

因此对于浏览器而言:1和2没有跨域;3遵循了限制跨域读的原则;4属于允许的例外。


虽然JSONP很好用,但它注定是get请求,get请求有语义要求(幂等)、长度限制(为了兼容限制255字节)、安全隐患(容易受到csrf攻击,csrf的解决必须是post请求配合token使用)。


那么,如何实现跨域post请求呢?

【解决方案】
1、CORS
概述:Cross-Origin Resource Sharing,W3C制定的跨站资源分享标准。post前会产生一次options嗅探(称之为preflight,但简单请求不会出现)来确认有否跨域请求的权限;客户端post时会带上Origin头指示来源网站,服务端响应时需带上Access-Control-Allow-Origin头与Origin头的值匹配,以示许可。ie8提供了封装好的XDomainRequest对象,部分实现了该标准;而其它浏览器则提供了XMLHttpRequest(Level 2)对象。
要求:ie8(XDomainRequest)/ie10/safari4/GC/FF3.5
参考:cross-site xmlhttprequest with CORS
参考:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS 
参考(中文):http://www.zfkun.com/394.html (simple reuest的定义描述不完整
优点:W3C标准方案
缺点:不兼容老浏览器,移动浏览器尚未支持。   桌面和移动浏览器兼容性

注意: 若在多个iframe之间跨域通信,优先考虑  window.postMessage

2、invisible iframe
概述:通过js动态生成不可见表单和iframe,将表单的target设为iframe的name以此通过iframe做post提交。提交后由于跨域,无法直接读取响应内容。一般的做法是,iframe内通过js改变自身location的fragment,外部则监听iframe的onload事件,读取fragment的内容。有现成的跨域iframe通信类库,如jQuery PostMessage Plugin。
要求:ie6/safari/GC/FF4
优点:兼容性佳,facebook,google,新浪已/曾采用
缺点:依赖hack实现,响应数据量大时需要切片、多次设置fragment并轮询,响应频繁时可能失效。

3、server proxy 
概述:当前域实现一个代理,所有向外部域名发送的请求都径由该代理中转。
缺点:每个使用方都需要部署代理, 数据中转低效, 对js有侵入。

4、flash proxy
概述:利用不可见的swf跨域post提交数据,需要部署crossdomain.xml。例如alirte会自动检测,若用户安装了flash,则以此实现跨域通信。
要求:flash9
优点:ADOBE标准方案,相对CORS兼容性佳,相对 invisible iframe 响应数据量较大时优势明显。
缺点:依赖flash。



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery Ajax 跨域 POST 请求是一种通过 jQuery 的 Ajax 方法发送 POST 请求并处理跨域请求的方式。跨域请求是指在浏览器中,通过 JavaScript 代码向不同名或端口发送请求的情况。 要实现跨域 POST 请求,可以使用以下步骤: 1. 在 HTML 文件中引入 jQuery 库: ```html <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> ``` 2. 使用 jQuery 的 Ajax 方法发送 POST 请求: ```javascript $.ajax({ url: 'http://example.com/api', type: 'POST', dataType: 'json', data: { key1: 'value1', key2: 'value2' }, success: function(response) { // 请求成功后的处理逻辑 console.log(response); }, error: function(xhr, status, error) { // 请求失败后的处理逻辑 console.log(error); } }); ``` 在上述代码中,`url` 参数指定了请求的目标地址,`type` 参数指定了请求的类型为 POST,`dataType` 参数指定了预期的响应数据类型为 JSON,`data` 参数指定了要发送的数据。 3. 在服务器端设置跨域请求的响应头: 为了允许跨域请求,服务器端需要设置响应头。具体的设置方法根据服务器端语言和框架而定。一种常见的设置方式是在响应头中添加以下内容: ``` Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: Content-Type ``` 上述代码中,`Access-Control-Allow-Origin` 允许所有名进行跨域请求,也可以指定具体的名。`Access-Control-Allow-Methods` 指定允许的请求方法为 POST,`Access-Control-Allow-Headers` 指定允许的请求头为 Content-Type。 注意:跨域请求需要服务器端的支持,如果服务器端没有正确设置响应头,浏览器会阻止跨域请求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值