关于IE8/7 使用AJAX跨域请求问题

项目内容:调用快递公司提供的API,对快递寄件、将信息存入数据库,按日期进行查询

开发技术:C#、asp、Javascript、Ajax、Layui,SQLServer

工具:VS、Postman、ie浏览器(ie11,ie8/7)、chrome

过程:

  1. 使用layUI(iframe版)进行布局,使用Layui是因为它支持IE浏览器,可以更好的兼容,提供日期插件,较为方便。
  2. Ajax调用API,进行寄件。寄件成功后回返回快递单号等信息。
  3. 将返回的信息和物品的重要信息通过Ajax传递给后台,存入数据库。
  4. 使用日期插件,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版本过低
              }
         }
       }

 如果有不正确的或可以改进的地方,请评论,欢迎批评指正。谢谢!

  

  

  

 

posted @ 2020-09-10 11:28  星辰_弈  阅读(720)  评论(0)    收藏  举报