ajax跨域访问遇到的问题及解决方案


Posted in Javascript onMay 23, 2019

Ajax请求一个目标地址为非本域(协议、域名、端口任意一个不同)的web资源,并根据响应获得外部应用数据。比如我们用Ajax访问城市天气预报、IP地址等公共服务接口时,就涉及跨域了。我们请求一个外部服务时,浏览器会基于安全问题拒绝授权访问。

而script、script、iframe标签的src属性就不存在跨域的问题,所以Ajax跨域就是利用这一点以及js对JSON的支持,外部服务只要给Ajax的请求响应一段JS代码或JSON数据,就能被Ajax获取到。

由于安全方面的原因, 客户端js使用xmlhttprequest只能用来向来源网站发送请求,比如在www.readlog.cn下去请求test.readlog.cn的数据,都是不行的。不过,解决办法倒是不少。这里整理一下。

解决方式1 web代理的方式 (on Server A)

由该页面代替用户页面完成交互,从而返回合适的结果。此方案可以解决现阶段所能够想到的多数跨域访问问题,但要求A网站提供Web代理的支持,因此A网站与B网站之间必须是紧密协作的,且每次交互过程,A网站的服务器负担增加,且无法代用户保存session状态。

解决方式2. on-Demand方式 (on Server A)

MYMSN的门户就用的这种方式,不过 MYMSN中不涉及跨域访问问题。在页面内动态生成新的

解决方式3. iframe方式 (on Server A)

查看过醒来在JavaEye上的一篇关于跨域访问的帖子,他提到自己已经用iframe的方式解决了跨域访问问题。数据提交跟获取,采用iframe这种方式的确可以了,但由于父窗口与子窗口之间不能交互(跨域访问的情况下,这种交互被拒绝),因此无法完成对父窗口效果的影响。

在页面内嵌或动态生成指向别的网站的IFRAME,然后这2个网页间可以通过改变对方的anchor hash fragment来传输消息。改变一个网页的anchor hash fragment并不会使浏览器重新装载网页,所以一个网页的状态得以保持,而网页本身则可以通过一个计时器(timer)来察觉自己anchor hash的变化,从而相应改变自己的状态。

解决方式4. 用户本地转储方式 (local)

IE本身依附于windows平台的特性为我们提供了一种基于iframe,利用内存来“绕行”的方案,即两个window之间可以在客户端通过windows剪贴板的方式进行数据传输,只需要在接受数据的一方设置Interval进行轮询,获得结果后清除Interval即可。FF的平台独立性决定了它不支持剪贴板这种方式,而以往版本的FF中存在的插件漏洞又被fixed了,所以FF无法通过内存来完成暗渡陈仓。而由于文件操作FF 也没有提供支持(无法通过Cookie跨域完成数据传递),致使这种技巧性的方式只能在IE中使用。

解决方式5: (其实还是在服务端A用iframe解决了与服务器B通信的问题)

要解决的问题:发生在用户提交网页 URL (还包括 Tag, Notes 等)给bookmark 服务器时。

关于 URL 的提交至少可以有三种方式:

1. 登陆 Bookmark 服务器的提交页面,将要收藏的 URL 通过该页面提交给服务器。
2. 安装浏览器插件,通过插件将 URL 提交给服务器。
3. 从 Bookmark 服务器动态加载 javascript 小工具到当前页面,通过它来完成提交工作。

第一种方式开发起来最简单,但对用户来讲比较麻烦,每次都需要先登陆 Bookmark 服务器才能完成提交;第二种方式我并不熟悉插件开发,而且用户也不喜欢太多的插件堆满自己的浏览器;第三种方式开发难度小,又避免了每次登陆服务器的麻烦,所以最终采用它。第三种方式中动态加载的 javascript 小工具除了需要生成 UI 供用户填写信息( URL , tag , notes 等),当用户点击提交的时候,还要完成与服务器通信的功能。

Javascript 相关文章推荐
用javascript实现画板的代码
Sep 05 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
Nov 26 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
JQuery在循环中绑定事件的问题详解
Jun 02 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
简单了解JavaScript异步
May 23 #Javascript
vue项目添加多页面配置的步骤详解
May 22 #Javascript
vue elementUI table 自定义表头和行合并的实例代码
May 22 #Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
May 22 #Javascript
微信小程序登录态和检验注册过没的app.js写法
May 22 #Javascript
element-ui上传一张图片后隐藏上传按钮功能
May 22 #Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 #Javascript
You might like
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
laravel model 两表联查示例
2019/10/24 PHP
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
python怎么调用自己的函数
2020/07/01 Python
Python运算符+与+=的方法实例
2021/02/18 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
DE1103使用报告
2022/04/05 无线电