公司内部要用几个内部系统,由于几个系统经常登录比较繁琐。所以需要统一登录认证的功能。回去一查 现在比较通用的方法为单点登录(比如CAS),但这个需要一个公共的认证服务,每个子系统还要有一个client端服务。由于其他系统是别的公司 不同语言开发的 ,不能让人家写client端程序吧!最后只得在本系统中实现直接登录其他系统。
既然不能用单点登录而且跨服务器、跨开发语言,只能用html和js来模拟登录动作了。大致想法为:本系统中放一个公共登录页,下拉框对应相应系统。登录时根据下拉系统跳转到远程html。
下拉框代码:
<select name="Searchtype" id="Searchtype">
<option value="系统1远程html地址">系统1</option>
<option value="系统2远程html地址">系统2</option>
<option value="系统3远程html地址">系统3</option>
</select>
onSubmit执行js为:
function oz(){ var type=document.getElementById("Searchtype").options[document.getElementById("Searchtype").selectedIndex].value; debugger; var name = base64encode(encodeURI($("#username").val())); var pass = base64encode(encodeURI($("#password").val())); // alert($.cookie("namets")); type=type+"?namets="+name+"&&passts="+pass; document.form1.action=type; }
这里采用url+用户名&密码的方式传送到远程html,登录的form采用post方式提交 否则会把其他元素值都带上了。为了安全起见,用户名密码经过了encodeuri和base64加密。
前面说的远程html放在相应系统的web服务器中,实质是一个html文件,这个html包括一个导航条(其他系统)和一个大iframe,iframe中包含了要访问的远程系统。iframe放于远程html中解决了“跨域”问题,初次访问该html进入登录页,把接收到的用户名密码放到对应框中并用js模拟点击登录按钮进入系统,这样用户就可以在本html中操作系统了。
为了便于用户点击导航切换系统,需要把用户名密码存于页面便于登录。这里使用了cookie实现这一功能。
下面为远程html代码:
<script type="text/javascript"> var iframe; function load() { debugger; iframe = document.getElementById("iframe"); iframe.onload = iframe.onreadystatechange = iframeload; iframe.src = "模拟登录系统url"; iframe.width = $("body").width() - 100; iframe.height = $(window).height() + 100; } function iframeload() { if (!iframe.readyState || iframe.readyState == "complete") { //alert("Local iframe is now loaded."); debugger; var url = location.href; //获取url中"?"符后的字串 var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); strs = str.split("&"); for ( var i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1]); } } var name = theRequest["namets"]; var pass = theRequest["passts"]; $.cookie("namets", "name",{expires:2}); $.cookie("passts", "pass",{expires:2}); var obj = document.getElementById("iframe").contentWindow; obj.document.getElementById("模拟登录系统用户名框id").value = name; obj.document.getElementById("模拟登录系统密码框id").value = pass; var ifmObj = obj.document.getElementById("模拟登录系统submit的id"); ifmObj.click(); } } function dd() { var ts = document.getElementById("sys1"); //ts.href = "http://192.168.1.25:8080/fan/zz.html"; //?name=system&pass=123456 alert($.cookie("namets")+""+$.cookie("passts")); ts.href="系统1的远程html文件"; } </script>
<body οnlοad="load()">
<div>
<a id="sys1" οnclick="dd()" target="_blank"><font color="red">系统1</font> </a>
<a id="sys2"><font color="red">系统2</font> </a>
<a id="sys3"><font color="red">系统3</font> </a>
</div>
<iframe id="iframe"></iframe>
</body>
使用时只要把该html放到要访问系统的服务器下即可
此程序的不足之处,还请高手们指教。