首先,这的确是一个问题;其次,这问题已经解决了。我在90分钟内搞定了此问题。
今天在某第三方支付平台上自助申请数字证书,在安装了CapiCom插件后,一点申请按钮,浏览器就报告说什么undefined错误,证书无法申请。我查了一下,是申请过程中JS没有考虑到特殊情况导致的。
我的IE6的window.navigator.userAgent的值是 Mozilla/4.0 (compatible; MSIE 6.0) ,第三方平台上从userAgent中获取OS版本的部分代码是:
var ua=window.navigator.userAgent;
var sVersion = ua.split(";")[2];
var sV = osVersion.substr(osVersion.length-3,1);
return osV;
显然,在上述ua下,osVersion一定会被赋上undefined的值,这势必导致osV在取值的时候出错。
实际上这个问题是由于用户浏览器的userAgent过长导致的。在IE中点击“帮助”->“关于”,本来正常可以弹出的对话框,还会再额外弹出“存储空间不足,错误53”的报错提示框。
然后lastwinner找到了一个解决此问题的最好的网址:http://www.enhanceie.com/ua.aspx(其他中文的站点我看了几个,都没有将问题说得明明白白的)
刚打开这页面,吓了我一跳:
上图中一开始页面就提示UA字符串超过200个字符可能会出问题,顺着提示和链接,进入了troubleshooting页面http://www.enhanceie.com/ie/troubleshoot.asp,按提示进行了第一步修正——干掉那些.Net的低版本Agent(不得不骂微软一句,你们干什么吃的啊……搞得我的浏览器的UA那么长):
干掉之后,发现警告信息少了一条,哦~~原来黄色底色的是警告信息呀,我还以为是什么demo……不管那么多,这时候去申请证书,申请成功了,因为window.navigator.userAgent已经忠实的返回了UA字符串——Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB7.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Embedded Web Browser from: http://bsalsa.com/; .NET CLR 3.5.30729),如图:
当然,现在还有警告,继续按指示处理。lastwinner提醒你一下:Embedded Web Browser from: http://bsalsa.com/; 并非什么病毒放置的信息,只是一个第三方嵌入式浏览器的开发公司。最后清理完的如图所示:
至此,IE的UA就非常干净了。总结此次Troubleshooting的过程:先定位问题所在,找出问题原因,然后利用搜索,找出合适的解决方案,最终实施解决策略,解决了问题。
随后我给第三方支付提供了一个解决此问题的方案,思路如下:
var sVersion = ua.split(";")[2];
var sV =0;
if(typeof(osVersion)=="undefined")
{
//弹出一个层,让用户确定自己的操作系统版本
}
else
sV = osVersion.substr(osVersion.length-3,1);
return osV;
让第三方支付的用户按我上述方式清理UA显然是不现实的,涉及到注册表的操作还是别让用户去操作的好。这个改进方案,只会对极少数用户弹出需要选择OS版本的对话框,而这种时候,这些用户是完全有能力识别自己操作系统的版本的。
发完解决方案,lastwinner一看时间,呼呼,差不多用了90分钟,真不容易。解决了问题,而且保留了当时的主要现场,心情不错,就随手写下了这篇博文。
转载请注明出处,谢谢!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29867/viewspace-700442/ ,如需转载,请注明出处,否则将追究法律责任。