AJAX跨域问题解决一:使用web代理

ajax跨域的问题一直是个问题,呵呵!

上次我就是通过这种方式来解决的:通过web代理.

今天看到一个文章,不算翻译,只是把意思表达一下

原文地址:http://developer.yahoo.com/javascript/howto-proxy.html

原文名称:JavaScript: Use a Web Proxy for Cross-Domain XMLHttpRequest Calls

Javascscript:使用web代理解决XMLHttpRequest跨域调用问题 

XMLHttpRequest对象(IE中的XMLHTTP对象)是当今尤其是ajaxweb应用程序的核心.但实际上,使用此对象来编写客户端web应用程序会在跨域的网络连接上受到web浏览器的严重限制.本篇”HOWTO”文章会简单的描述本问题,简单的去理解并且提供一个可行的解决方案:web代理,(它可以)从你的web服务器转发网络请求到类似Yahoo! Web Service APIs这样的服务(提供者).

  • 为什么需要一个代理
  • Yahoo! Web ServicePHP代理
  • 其他解决方案
  • 更多信息
  • 为什么需要一个代理

    所有的现代web浏览器在网络连接的时候会强制执行一个安全限制,其中就包括调用XMLHttpRequest.此安全限制阻止脚本或者应用程序连接任何其他的不是来自本域的web服务(IE下可通过修改开启选项来允许跨域请求).如果你的web程序和程序说使用的XML数据来自同一服务器,那么它将不会遵循这个安全限制.

    但是,如果你的web应用程序在一个web服务器上而web服务数据请求另外一个如Yahoo! Web Service这样的服务器,那么服务器会从根本上限制本次连接.

    这个问题有很多解决方案,最通用的就是在你的web服务器上安装一个代理.你可以通过调用自己的web服务代理来代替直接调用web服务的XMLHttpRequest对请求.然后代理传递请求到web服务,并且返回客户端应用程序所需要的数据.因为连接出自你自己的服务器,数据来自你自己的服务器,所以你的浏览器不会受到什么限制.

    出于安全考虑,web服务器上安装的任何代理被限制使用是一个好主意.转发连接到任意网站url的开放式代理会被滥用.尽管很难限制连接只能来自你自己的应用程序,但是你可以阻止代理去连接那些你没有指定的服务器. Hard code the URL to connect to in the proxy itself 或者提供限制选项.这可以使得代理对不是你的客户端应用程序的用户较低的开放和较少的应用.(A)

     

    Yahoo! Web ServicePHP代理

    (省略...)

    其他解决方案

    除了通过使用web代理来转发应用程序的服务数据外,还有其他几种方式来绕过浏览器的跨域限制.

  • 使用阿帕奇的mod_rewrite or mod_proxy来从你的服务器上转发到另外的服务器.在你的客户端代码中你只要做请求就可以了,就好象工作在你自己的服务器上-------不会有浏览器的限制问题.然后阿帕奇会神奇的为你请求其他服务器.
  • 使用json或者动态<script>标记来替代xmlXMLHttpRequest.你可以通过直接在<script>标记内发送你的web服务请求,这样就可以完全绕过浏览器的安全限制.你使用的yahoo服务能够输出JSON(使用output=jsoncallback=function参数),当页面加载完成后从web服务返回的数据已经被优化为javascript对象.参见JSON Documentation.
  • 对你的脚本进行数字签名.FireFox,你可以为你的脚本和那些信任站点的脚本申请一个数字签名.这样FireFox就会允许你通过XMLHttpRequest访问任何的域.但是,其他浏览器不支持这种方式的脚本签名,所以,这种解决方案会受限.
  •  

     

    -------------------------------------------------------------------------------------------------------------------------------------------------------

     

     

    个人经验

    前端时间用到了ajax的跨域,我采用的方法就是采用本文介绍的方法,其实这种方法的优点还是很多的,比如:简单,易于控制.业务逻辑和实现都不复杂.

    另外这种方式还可以实现一个好处,隐藏信息,这就是文中A处所说的问题

    加入我们的请求为:http://www.abc.com/person?key=asdfghjkl

    数据返回此帐户的在线银行余额(完全是假设)

    我们不想让别人知道传递的关键字为asdfghjkl,那么我们在前台完全可以采用

    请求为: http://www.myweb.com/person?key=a或者http://www.abc.com/person?key=123456

    访问我们自己的网站,通过自己的后台去对key进行重新的处理,这样保证了隐私保护.

     

     

    原文地址:https://www.cnblogs.com/Reany/p/1339795.html