浏览器插件和⾃定义协议
前⼀阵⼦⼀直在折腾浏览器的插件检测和⾃定义协议的⽀持。
经过种种痛苦的折腾,算是对这⼀领域有了点浅显的认知。特此记录⼀下
然⽽我们也经常会遇到类似这样的协议连接
thunder://  迅雷的
item://  itunes的
ed2k:// 电驴的
这样的协议是需要本地计算机安装软件与之接应,实现相应操作的
也就是当你点⼀个类似的连接,浏览器会通知系统以何种程序处理该种协议的连接,这种对应是通过注册表来实现的
⼆、实现⽅案
要定义⼀个⾃定义协议,⾸先需要你有⼀款程序与之对应,
也就是说这个协议得有软件去处理,⼀般会是下载操作。
⽽⾃定义协议连接最终是显⽰在⽹页上的,最终这是⽹页与本地程序之间的交互。
⽽之间的桥梁就是浏览器。
那么要⽀持⼀个⾃定义协议,还需要去检测本地是否有⽀持该协议的处理程序。
这个能⼒的检测是要通过检测浏览器的插件来判断的。
也就是装软件的时候同时给浏览器增加插件,以便标⽰系统有能⼒⽀持协议。
画⼀个流程图:
发布软件和⾃定义协议——》安装软件同时给浏览器安装插件———》⽤脚本检测浏览器插件以判断⽀持情况————》点击⾃定义协议连接调⽤本地程序处理
三、插件检测
IE 可以通过尝试 new ActiveXObject(axname); 操作是否成功来判断插件存在情况
var a =  false;
try {
var obj =  new ActiveXObject(axname);
a =  true;
}  catch (e) {
a =  false;
};
return a;
IE的另⼀种⽅法是预先埋设⼀个 object 并查看该object的属性或者⽅法来判断本地是否有能⼒⽀持
⽐如apple itunes的object为:<object classID="CLSID:D719897A-B07A-4C0C-AEA9-9B663A28DFCB" width="1" height="1" id="iTunesDetectorIE"
></object>
Firefox Chrome 等浏览器可以通过遍历其plugin 查看pluginName是否符合来判断插件存在情况
var a =  false;
if(navigator.plugins && navigator.plugins.length > 0) {
for( var b = 0; b < navigator.plugins.length; b++) {
var c = navigator.plugins[b];
var d = c.name;
if( new RegExp(plugname,'i').test(d)) {
a =  true
}
}
}
return a
另⼀种⽅法是通过mimetype 做判断
try    {
var mimetype = navigator.mimeTypes["application/"+plugname];
if(mimetype){
a =  true;
} else{
a =  false;
}
}
catch (e) {
a =  false;
}
return a;
四、存在的问题:
IE操作activeX控件的时候浏览器可能会出现⼩黄条提⽰这可能跟你的浏览器设置相关,会有安全提⽰,这是⽆法避免的也不要企图捕获⼩黄条出现的事件,这是安全提⽰,除⾮⽤户主动操作,其他⼿段⽆法⼲预
当你的插件在不同的域名下运⾏时,会重复提⽰,只有⽤户允许在该域名下运⾏时,提⽰才会消失。
当然如果你肯花钱,你可以做成 itunes的插件那样的,默认在任何域名下运⾏
五、具体应⽤的实现流程
进⼊页⾯,
浏览器判断
不同浏览器的插件⽀持检测
cookie记录检测结果
没有插件————》预加载弹窗提⽰资源
浏览器的activex控件监测专⽤协议连接的点击情况
根据插件⽀持检测结果做相应操作
有插件————》调⽤本地程序处理
⽆插件(或者检测不到)————》弹窗提⽰安装软件
六、关于强制调⽤
如果不能确定本地有没有相应程序⽀持,⽽强制将专⽤链接给浏览器处理会怎样?
Firefox Chrome 都有有好的提⽰界⾯,提⽰浏览器不知道采⽤何种程序处理该协议的链接
IE 不同版本会有不同表现,这跟它们的安全级别相关。
⾸先所有的IE都会显⽰⼀个丑陋的界⾯表⽰浏览器打不开这个链接
IE6的安全性能最差,你可以⽤⼀个隐藏的iframe 来调⽤这个专⽤链接,⽽不会看到报错信息,运⽓好的话你可以
调起本地程序
IE7 8 9 则提升了安全性能,如果⽤隐藏的iframe来调⽤不识别的链接时,⽆论嵌套⼏层,总会⽴即反映到最顶层
显⽰⽆法打开该链接,意在通知⽤户你在调⽤⼀个不识别的协议,可能会危害你的计算机安全。
IE9 第⼀次会报错,显⽰⽆法打开,⽽再次点击则不会重复显⽰⽆法打开的页⾯。
七、具体项⽬应⽤和代码实现
⽰例地址:
⾃⼰的总结:可以通过写vbs⽂件,动态⽣成注册⽂件,然后执⾏注册⽂件,实现⾃定义协议的注册。
Set WshShell = WScript.CreateObject("WScript.Shell")
RelativeFolder = wshShell.CurrentDirectory
mychrome=RelativeFolder & "\"
mychrome=Replace(mychrome,"\", "\\")
c=RelativeFolder & "\注册插件.reg"
Set fso = CreateObject("scripting.filesystemobject")
Set myfile=fso.CreateTextFile(c,2,ture)
myfile.writeline "Windows Registry Editor Version 5.00"
myfile.writeline "[HKEY_CLASSES_ROOT\eZECM4HQ]"
myfile.writeline "@=""eZECM4HQ Protocol"""
myfile.writeline """URL Protocol""="""""
myfile.writeline "[HKEY_CLASSES_ROOT\eZECM4HQ\DefaultIcon]"
myfile.writeline "@="""& mychrome &",1"""
myfile.writeline "[HKEY_CLASSES_ROOT\eZECM4HQ\shell]"
myfile.writeline "@="""""
myfile.writeline "[HKEY_CLASSES_ROOT\eZECM4HQ\shell\open]"
myfile.writeline "@="""""
myfile.writeline "[HKEY_CLASSES_ROOT\eZECM4HQ\shell\open\command]"
myfile.writeline "@=""\"""& mychrome & "\"" \""%1\"""""
myfile.Close
WshShell.run chr(34)&c&chr(34),,true
注册成功后,就可以在浏览器中输⼊
利⽤mychrome创建绿⾊版chrome,将vbs和绿⾊版⽂件⼀并压缩成exe程序,⽤户在ie上运⾏的时候,可以通过js写cookie,依此来判断⽤户是否注册成功了(此⽅法有漏洞,但是⽤new  ActiveXObject(axname)判断的时候,需要降低⽤户的安全性,⽤户更不能接受。⾄于上⾯说的objec,
还没有试过,有⼼的朋友可以尝试⼀下,并把结果告诉我,共同提⾼)
注意:ie调⽤本地程序,安全级别⽐较低的情况下,可以在js创建WScript.Shell:
try{
var wsh = new ActiveXObject('WScript.Shell');
if (wsh){
var strDesktop = wsh.SpecialFolders(4);
var c="\""+strDesktop+"\\档案管理系统\"";
try{
var rev=wsh.Run(c);
if(rev!=0){//返回错误
}
}catch(e){
alert("没有到相应的安装插件,稍候会⾃动下载,下载成功后,请运⾏安装。");    download();
return null;
}
close();
wsh = null;
}
}catch(e){
alert("由于您的安全策略影响,请点击页⾯\"⼿动下载\"下载插件");
return null;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。