一、在AK环境下的Key登录模拟调试之前,首先需要插入密钥或使用单点登录-websocket标准接口模拟服务.rar工具进行模拟
单点登录-websocket标准接口模拟服务使用说明:解压压缩包启动ws_server-soft.exe程序,如无法启动可参考“ws_server-soft.exe无法打开的问题.txt”,如需替换密钥请参考“替换密钥说明.txt”,(请确保30318端口未被占用)
二、在登录页的jsp中添加ByWebSocket()函数,用于连接websocket接口,发送请求并返回密钥信息,其中ws.onmessage = function (evt){}函数为处理响应消息的回调函数,可以在方法体内读取并处理密钥信息
请求获取密钥
|
三、获取到密钥信息后,在正常登录(即账号密码验证)之前,添加账号与密钥匹配判断
-
前台方法如下:
获取密钥,请求成功后发送Ajax获取密钥匹配是否成功
function
verifySecretKey(lx) {
var
me =
this
;
var
msg =
''
;
if
(lx !=
"huiDiao"
){
ByWebSocket();
//当初次调用时请求获取密钥信息
}
else
if
(lx ==
"huiDiao"
){
//WebSocket onmessage回调函数完成后再次调用时,走以下程序
var
UserName = $(
"#userName"
).val();
var
SecretKey = rmsid;
$.ajax({
url:
"/portal/home/mainpage/verifySecretKey"
,
type:
"get"
,
data:{userName:UserName,secretKey:SecretKey},
dataType:
"json"
,
async:
false
,
success:
function
(result){
//var jsonResult = JSON.parse(result);
var
obj = eval(result);
if
(obj.success==
true
){
msg = obj.msg;
secretKeyFlag=
true
;
}
else
{
msg = obj.msg;
secretKeyFlag=
false
;
}
},
error:
function
(){
}
});
if
(!secretKeyFlag){
$(
"#errorinfo"
).show().html(msg);
//显示错误信息
}
else
{
$(
"#errorinfo"
).html(
""
).hide();
}
//提交
$(
'#form'
).submit();
//开始用户名和密码的校验
return
secretKeyFlag;
}
}
-
后台方法如下:
后台校验密钥方法
/**
* 登录时校验密钥
* @return
*/
@Action
public
String verifySecretKey() {
ActionContext ac = ActionContext.getActionContext();
HttpServletRequest reqeust = ac.getHttpServletRequest();
HttpServletResponse resp = ActionContext.getActionContext().getHttpServletResponse();
Map<String,Object> rtnMap =
new
HashMap<String, Object>();
String loginWithSecretKey = System.getProperty(
"loginWithSecretKey"
);
if
(
"true"
.equals(loginWithSecretKey)) {
String secretKey = reqeust.getParameter(
"secretKey"
);
String userName = reqeust.getParameter(
"userName"
);
Map<String,Object>params =
new
HashMap<String, Object>();
params.put(
"rmsid"
, secretKey);
params.put(
"userName"
, userName);
if
(
null
!= secretKey && secretKey.trim().length() >
0
) {
//匹配
int
checkSecretKey =
this
.bdsoftMybatisUtils.selectOne(
"repository.portal.navigate.CheckSecretKey"
,params);
if
(checkSecretKey==
1
) {
rtnMap.put(
"success"
,
true
);
rtnMap.put(
"msg"
,
"密钥与账号匹配成功!"
);
}
else
{
rtnMap.put(
"success"
,
false
);
rtnMap.put(
"msg"
,
"登录失败,请检查用户名、密码、密钥是否正确!"
);
}
}
else
{
//未读取到密钥信息,请插入密钥后重试
rtnMap.put(
"success"
,
false
);
rtnMap.put(
"msg"
,
"未读取到密钥信息,请插入密钥后重试!"
);
}
}
else
{
//无需匹配
rtnMap.put(
"success"
,
true
);
rtnMap.put(
"msg"
,
"未开启需要伴随密钥登录配置项,跳过密钥检测!"
);
}
return
Json.encode(rtnMap);
}
四、由全局变量secretKeyFlag判断当前的密钥校验是否通过,并将secretKeyFlag变量添加到登录函数(form的submit函数中),即if(secretKeyFlag==false||$('#userName').val() == '')则禁止登录
前台限制密钥校验失败禁止登录
|