ajax跨域有没有踩过坑,IE低版本浏览器如何支持?
同源策略
为了保证用户信息的安全,防止恶意的网站窃取数据,所有的浏览器都实行这个策略。
同源策略是指,用户在A网页上的所产生的信息,B网页上不能访问,反过来A网页也不能访问其它网页的信息,除非这两个网页"同源"。
为什么说同源策略可以保证用户信息安全,举个栗子:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?
两个文档同源需满足
1. 协议相同
2. 域名相同
3. 端口相同
Ajax跨域通信
同源策略规定,Ajax请求只能发给同源的网址,否则就报错。然而我们开发过程中常常会碰到需要请求不同服务器上的数据。那么Ajax跨域通信就必须要解决了。
三种方式:
- JSONP:JSONP是服务器与客户端跨源通信的常用方法,网页通过添加一个<script>元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。可惜只能是发送 get 请求
- WebSocket:WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。(基本上不用此种方式,学习成本比较高)
- CORS:CORS是跨源资源分享(Cross-Origin Resource Sharing)的缩写。它是W3C标准,是跨源AJAX请求的根本解决方法。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10
CORS
- ie浏览器版不能低于IE10
- 后台服务器脚本需要明白的一些请求头:
Access-Control-Allow-Origin:允许哪些url可以跨域请求到本域,Access-Control-Allow-Origin:* 表示所有url都可以请求到本域名,如果你很懒可以这样写
Access-Control-Allow-Methods:允许的请求方法,一般是GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age:表明在该时间段内不再“预检”允许的请求方法(相当于缓存),即不以OPTIONS方法进行请求
Access-Control-Allow-Headers:允许哪些请求头可以跨域
CORS Python服务器请求头示例:
你将以下代码放到你的php代码的头部,咱们就可以实现ajax跨域请求了
response = HttpResponse(json.dumps({"key": "value", "key2": "value"})) response["Access-Control-Allow-Origin"] = "*" response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS" response["Access-Control-Max-Age"] = "1000" response["Access-Control-Allow-Headers"] = "*"
IE10以上版本,都好办,问题是有些用户就用了IE7,8该怎么办?当然,首先是鄙视一下这部分用户,鄙视完了,还是要想办法解决问题,毕竟做产品还是要以用户为上~
网上查了一圈,发现IE7 和以前是不支持跨域请求的, IE8 通过 XMLDocumentRequest实现,而不是 XMLHTTPRequest,所以IE8下面应该这样写:
// 创建XHR对象
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// 针对Chrome/Safari/Firefox.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// 针对IE
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// 不支持CORS
xhr = null;
}
return xhr;
}
// 发送CORS请求
function makeCorsRequest(method, url, cb) {
// bibliographica.org是支持CORS的
var xhr = createCORSRequest(method, url);
if (!xhr) {
alert('CORS not supported');
return;
}
// 回应处理
xhr.onload = function () {
var text = xhr.responseText;
text = $.parseJSON(text);
cb(text);
};
xhr.onerror = function () {
alert('Woops, there was an error making the request.');
};
xhr.send();
}
拉下来,我们就区分一下浏览器,如果是IE10以下版本,那就直接另一种方式,调用上面的实现方式。
- golang 标准库间依赖的可视化展示
- 静态变量和实例变量的区别(配图解释专业术语,通俗易懂)
- 论golang是世界上最好的语言
- 用shape画内圆外方,形成一个圆形头像
- 在Go中对gRPC+ProtoBuf与Http+Json进行基准测试
- Achartengine.jar绘制动态图形一 --饼图
- 工具| 关于Python线程和队列使用的小思考
- Java中list<Object[]>、list<Student>、list<Map<String,String>>排序
- Java-单例模式详解(图文并茂,简单易懂)
- Fragment生命周期及实现点击导航图片切换fragment,Demo
- 《GO IN ACTION》读后记录:GO的并发与并行
- SharedPreferences 存List集合,模拟数据库,随时存取
- Servlet与Jsp的结合使用实现信息管理系统一
- Mac下nvm管理node.js版本问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端面试(题三)js
- .NET Core EFCore零基础快速入门简单使用
- vscode .vue文件 格式化配置
- 使用代码删除SAP CRM的附件(attachment)数据
- node版本管理器:nvm 和 n区别
- Apache - Hive环境部署与快速入门
- 编译和调试openjdk8
- linux编译openjdk8
- Elasticsearch从入门到放弃:瞎说Mapping
- PostgreSQL 为什么接受大量连接到数据库需要连接池
- 一站式的开源持续测试平台---MeterSphere
- 《RabbitMQ》如何保证消息的可靠性
- Ruby 和 Java 的基础语法比较
- 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
- 聊聊面试-int和Integer的区别