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 面向对象技术基础教程
Mar 03 Javascript
jQuery最佳实践完整篇
Aug 20 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
Apr 25 Javascript
一个判断抢购时间是否到达的简单的js函数
Jun 23 Javascript
简单实现jQuery进度条轮播实例代码
Jun 20 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
Jan 08 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
Feb 28 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
Jul 23 Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 jQuery
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
如何用JS实现网页瀑布流布局
Apr 24 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自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python splitlines使用技巧
2008/09/06 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
python同步windows和linux文件
2019/08/29 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
个人职业生涯规划书1500字
2013/12/31 职场文书
铲车司机岗位职责
2014/03/15 职场文书
校庆活动方案
2014/03/31 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
2014年采购部工作总结
2014/11/20 职场文书
英文产品推荐信
2015/03/27 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
交通安全教育心得体会
2016/01/15 职场文书
apache ftpserver搭建ftp服务器
2022/05/20 Servers