`

跨域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。
 
 
http://www.cnblogs.com/davidwang456/p/3977627.html
分享到:
评论

相关推荐

    js跨域问题小结

    CORS可以处理所有类型的HTTP请求,包括POST、PUT等,同时提供了预检请求(OPTIONS)机制,确保了跨域请求的安全性。 3. document.domain:这种方法适用于顶级域名相同,子域名不同的情况。通过设置`document.domain...

    node跨域请求方法小结

    在示例代码中,虽然没有完整展示jQuery的跨域POST请求,但可以使用`$.ajax`或`$.post`方法,配合`dataType: 'json'`来发送JSON数据,并处理服务器的响应。 总之,Node.js实现跨域请求通常涉及设置服务器响应头以...

    JS跨域访问解决方案总结

    #### 六、小结 CORS作为跨域资源共享的标准,极大地提高了Web应用的安全性和灵活性。通过合理配置HTTP头部信息,开发者可以在确保安全的同时,实现高效的数据交换和功能集成。随着技术的发展,CORS将继续发挥重要...

    AJax与Jsonp跨域访问问题小结

    AJAX与JSONP跨域访问问题小结 AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。它通过使用XMLHttpRequest对象来与服务器进行异步通信。XMLHttpRequest对象...

    详解iframe跨域的几种常用方法(小结)

    【详解iframe跨域的几种常用方法(小结)】 在互联网业务不断发展的背景下,为了实现代码的复用和提升效率,公共组件的构建变得尤为重要。然而,由于各项目技术栈的差异,直接引用这些组件可能会遇到困难。为了解决这...

    ajax小结

    **Ajax小结** Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新,...

    详解vue-cli项目中的proxyTable跨域问题小结

    总之,Vue CLI 的 `proxyTable` 是一种方便的开发环境跨域解决方案,它使得开发者能够在本地开发时,无需修改后端接口即可进行跨域请求,提高了开发效率。然而,在生产环境中,通常需要依赖 CORS 或其他跨域策略来...

    Js+Ajax,Get和Post在使用上的区别小结

    - POST方法:POST请求将参数包含在请求体中,通过`send()`函数发送。数据格式通常设置为`application/x-www-form-urlencoded`,意味着参数以键值对的形式编码,如`text=value1&param2=value2`。POST方法没有长度...

    json与jsonp知识小结(推荐).docx

    ### JSON与JSONP知识点详解 #### 一、JSON简介 ...JSON提供了结构化的数据格式,而JSONP则是在特定场景下(主要是跨域请求)的一种解决方案。理解和掌握这两种技术对于开发高效可靠的Web应用至关重要。

    Jquery中$.post和$.ajax的用法小结

    例如,向服务器发送一个简单的POST请求,获取JSON响应: ```javascript $.post('server.php', {name: 'John'}, function(response) { console.log(response); }, 'json'); ``` `$.ajax`则提供了更全面的选项来...

    json与jsonp知识小结(推荐)

    需要注意的是,JSONP只支持GET请求,并不支持POST请求。 另外,现代浏览器支持的HTML5提供了解决跨域问题的新技术,即XMLHttpRequest Level 2(XHR2)。XHR2扩展了XMLHttpRequest对象,使得跨域请求更加方便。对于...

    jquery 相关问题

    在提供的文档《Ajax请求小结.doc》中,可能包含了关于jQuery如何处理Ajax请求的详细总结,包括不同类型的请求(GET、POST等)、请求参数设置、错误处理以及与其他jQuery方法的集成等内容。通过阅读这份文档,你可以...

    ajax开发详解.rar

    如果是POST请求,参数放在`send()`方法的参数中。 4. **监听状态变化**:通过`onreadystatechange`事件监听请求的状态,当状态变为4(表示请求已完成)且状态码为200(表示成功)时,表示数据已经返回。 5. **处理...

    简单介绍jsonp 使用小结

    同源策略是为了防止恶意脚本通过跨域请求获取敏感数据,但这也限制了Web应用的灵活性。 然而,JSONP巧妙地利用了HTML `<script>` 标签的跨域特性来规避这一限制。因为浏览器不会对`<script>`标签的`src`属性执行...

    js 使用ajax设置和获取自定义header信息的方法小结

    在JavaScript中,Ajax技术常用于实现页面的异步数据交互,而设置和获取自定义header信息则是Ajax请求中一个重要的功能。以下是对该主题的详细解释: ### 1. 设置自定义Header信息 #### 1.1 使用`beforeSend`回调...

    非常详尽的Ajax教程.doc

    ### 2.9 小结 理解并熟练运用XMLHttpRequest是掌握Ajax的基础。 ### 3. 处理服务器响应 处理服务器响应涉及解析数据、更新DOM、错误处理等步骤。 ### 4. 实践应用 包括验证、首部读取、动态加载、自动刷新、显示...

    $.ajax传JSON数据到后台的注意事项小结

    4. **服务器端接收**:在服务器端,如ASP.NET,可以使用`Request.Form`来获取POST请求的数据。例如,`context.Request.Form["typename"]`将尝试获取名为`typename`的字段。然而,如果值为`null`,在服务器端尝试访问...

Global site tag (gtag.js) - Google Analytics