关于IE8/7 使用AJAX跨域请求问题
项目内容:调用快递公司提供的API,对快递寄件、将信息存入数据库,按日期进行查询
开发技术:C#、asp、Javascript、Ajax、Layui,SQLServer
工具:VS、Postman、ie浏览器(ie11,ie8/7)、chrome
过程:
- 使用layUI(iframe版)进行布局,使用Layui是因为它支持IE浏览器,可以更好的兼容,提供日期插件,较为方便。
- Ajax调用API,进行寄件。寄件成功后回返回快递单号等信息。
- 将返回的信息和物品的重要信息通过Ajax传递给后台,存入数据库。
- 使用日期插件,Ajax检索符合条件的数据。
重点:
1.请求API时,报错:(https)referrer policy:no-referrer-when-Downgrade
原因:服务器安全升级,不符合新的安全策略
解决:<meta name="referrer" content="origin">
2.在ASP页面,发送AJAX请求,无响应(一闪而过,其实是被刷新掉)
原因:ASP中有<form>标签,在button被点击,提交请求后,表单也会自己提交一个请求,页面被刷新
解决:阻止表单提交刷新页面,添加 onsubmit="return func();" function func() { return false;}
3.Ajax请求出错500
原因:未进行json序列化(失误)
解决:Json.Stringify(data);
4.调用API需要传入的参数是需要即时生成的(MD5加密算法)
事先需要将字符串数组进行排序,组合成新的字符串(仅限本项目)
下面是 MD5加密算法(32位加密)c#
//MD5加密算法 sign public string UserMd5(string str) { string cl = str; string pwd = ""; MD5 md5 = MD5.Create();//实例化一个md5对像 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 pwd = pwd + s[i].ToString("x2"); } return pwd; }
需要将c#中的返回值传入asp页面:<%方法名%>,c#中的方法需要添加static WebMethod
5.将中文字符存入数据库时乱码
解决:在参数之前加‘N’
6.Ajax嵌套时,将异步改为同步
难点:代码上传至服务器后才知道,浏览器默认为IE7。框架不兼容,Ajax请求的时候也有问题(这里使用的是jQuery Ajax)。(先搞清楚再进行开发)
1.ie版本过低,引用的jQuery版本从3.0.0 改为1.7.1
问题及解决:因为版本过低所以不支持json的序列化与反序列化,需引入json2.js文件(可到git下载)
2.在ie7/8环境下,进行Ajax请求出现No Transpost,直接返回错误
尝试解决:添加alert(Jquery.Support.cros );判断是否支持跨域访问,ie11显示true,ie7/8显示false, 添加Jquery.Support.cros = true,ie7/8显示true,可仍然无法正常处理请求。
解决:最后放弃了jQuery Ajax采用原生的Ajax。在使用时首先要做兼容处理。代码如下:
//创建AJAX对象 做兼容处理 var xhr = null; try{ xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){ } } if (xhr == null) { xhr = new XMLHttpRequest(); } //请求方式,请求地址 xhr.open('post', url); //请求头 xhr.setRequestHeader('Content-Type', 'application/json'); //发送请求 xhr.send(JSON.stringify(data)); //这里要如果要发送json数据需要序列化处理一下,低版本的不支持,需要引入json2.js文件 //获取服务器响应到客户端的数据 xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200) { var result = xhr.responseText; var msg = JSON.parse(result); //反序列化,同样需要引入json2.js文件,如果jQuery版本过低 } } }
如果有不正确的或可以改进的地方,请评论,欢迎批评指正。谢谢!

浙公网安备 33010602011771号