问题描述:
项目中的企业微信内部应用,使用Vue-cli搭建的H5页面web,在低版本的安卓手机或ios8.0、9.0中出现接口数据访问失败,HTTP状态码返回0的问题,无法正常使用系统。安卓手机主要出现问题得机型为oppo、vivo。
问题分析:
旧版本系统对ES6新特性不支持。比如箭头函数,let,const。另外,还有少部分低版本安卓不支持小部分的ES5语法。
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=Edge,IE=IE9"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
在main.js中引入:require('es6-promise').polyfill()
或者
1 import Es6Promise from 'es6-promise' 2 Es6Promise.polyfill()
二:用于对ES6新语法不支持的浏览器
安装依赖:npm install babel-polyfill -S
在main.js中引入:import "babel-polyfill",放在最顶部,确保全面加载
更改 webpack.base.conf.js 文件中的入口 entry:
1 entry: { 2 app: ["babel-polyfill", "./src/main.js"] //为低版本系统配置 3 //app: './src/main.js' //旧配置 4 },
重新打包发布,问题解决。
【补充拓展】IE浏览器中,以上方法设置后,依然会有报错,还需要把es6转es5
http中标准的head,认证名字叫做Authorization,A要大写,但在vue用axios跨域请求时,传的head名称为authorization,是小写,所以如果是使用IE浏览器,即使是设置Access-Control-Allow-Headers为*,也无法识别!
解决办法:
后台服务器权设置Access-Control-Allow-Headers为'authorization,Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type',强制包含一个authorization头即可
response.setHeader("Access-Control-Allow-Headers", "authorization,Authorization,DNT,X-CustomHeader," +"Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type");
或:
1 protected override void Application_BeginRequest(object sender, EventArgs e) 2 { 3 Response.Headers.Add("Access-Control-Allow-Origin", "*"); 4 if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")//拦截处理Options请求 5 { 6 string domain = Request.Headers.Get("Origin"); 7 8 Response.Headers.Add("Access-Control-Allow-Methods", "*"); 9 Response.Headers.Add("Access-Control-Allow-Headers", "authorization,Authorization,DNT,X-CustomHeader," + 10 "Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,*"); 11 Response.Flush(); 12 Response.End(); 13 } 14 base.Application_BeginRequest(sender, e); 15 }
注意:如果在后台接口层面进行了跨域设置,就不要在iis中在单独设置http响应头。