实现多个系统的模拟登录
公司内部要用几个内部系统,由于几个系统经常登录比较繁琐。所以需要统一登录认证的功能。回去一查 现在比较通用的方法为单点登录(比如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 onload="load()"> <div> <a id="sys1" onclick="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放到要访问系统的服务器下即可
此程序的不足之处,还请高手们指教。