SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。
这里只是介绍下一种简单的实现,并不能完全称为SSO,即通过URL的传值来实现同一登陆界面对不同系统的登录(在一个界面里把要登录的系统账号密码都输一遍,之后访问各个系统都是已登录状态)。
总体说下思路,核心就是把登录其他系统的URL直接发出去而不再分别访问它们的登录页。首先在一个系统中设置要进行多点登录的系统,输入系统名、用户名输入框ID、密码输入框ID、form表单名、登录链接URL、字符集等,把它们做为设置保存起来,这里可以存在properties文件中,避免未登录时访问数据库的不稳定性,存储方式采用json字符串的形式。在登录总系统时,有下拉框选择登录其他系统,登录其他系统时采用把用户名和密码传到主页面的一个iframe中的页面中进行提交,这样可以避免字符集不同造成的问题。
部分代码:
对json进行处理的例子(根据需要使用其中方法)
登录页面js方法(登录其他系统)
后台把系统的其他信息直接传到iframe中的页面
这里只是介绍下一种简单的实现,并不能完全称为SSO,即通过URL的传值来实现同一登陆界面对不同系统的登录(在一个界面里把要登录的系统账号密码都输一遍,之后访问各个系统都是已登录状态)。
总体说下思路,核心就是把登录其他系统的URL直接发出去而不再分别访问它们的登录页。首先在一个系统中设置要进行多点登录的系统,输入系统名、用户名输入框ID、密码输入框ID、form表单名、登录链接URL、字符集等,把它们做为设置保存起来,这里可以存在properties文件中,避免未登录时访问数据库的不稳定性,存储方式采用json字符串的形式。在登录总系统时,有下拉框选择登录其他系统,登录其他系统时采用把用户名和密码传到主页面的一个iframe中的页面中进行提交,这样可以避免字符集不同造成的问题。
部分代码:
对json进行处理的例子(根据需要使用其中方法)
private Map getMainData(String data) {
if (data == null) return null;
//将一个字符串转换为JSON对象
JSONObject jObject = JSONObject.fromObject(data);
if (jObject == null) return null;
//从一个JSON对象中取出名为“ary”的数组
JSONArray recordAry = JSONArray.fromObject(jObject.get("ary"));
if (recordAry == null || recordAry.size() == 0) return null;
Map map = new HashMap();
for (int i = 0; i < recordAry.size(); i++) {
//从JSON数组中取得一个JSON对象
JSONObject obj = recordAry.getJSONObject(i);
if (obj == null) continue;
String value;
try {
//从JSON对象中取得一个属性,如果无法确定该属性一定存在,要加try{}catch(){}
value = obj.getString("v");
} catch (Exception ex) {
continue;
}
//将一个对象放入JSON对象中,这里注意是加入不是替换!!!要想替换要删掉原来的再重加入
obj.accumulate("key", "value");
}
//将一个JSON对象转为字符串
String jsonStr = jObject.toString();
return map;
}
登录页面js方法(登录其他系统)
function webLogIn() {
//取出要登录系统登陆页面的form名、输入框id
var formName = document.all.actForm.formName.value;
var userNameInputId = document.all.actForm.userNameInputId.value;
var pasdInputId = document.all.actForm.pasdInputId.value;
//得到iframe中页面元素,注意使用eval处理名称是变量的情况
var webUserIdElement = eval("webPage.document.all."+formName+"."+userNameInputId+";");
var webUserPwdElement = eval("webPage.document.all."+formName+"."+pasdInputId+";");
webUserIdElement.value = document.all.actForm.userId.value;
webUserPwdElement.value = document.all.actForm.userPwd.value;
if (document.all.actForm.userId.value== "") {
alert("请输入用户名。");
return false;
}
if (document.all.actForm.userPwd.value=="") {
alert("请输入密码。");
return false;
}
var objForm = eval("webPage.document."+formName+";");
alert("请求已提交");
objForm.submit();
}
后台把系统的其他信息直接传到iframe中的页面