//前端自定义规则校验(前端页面增加缓存window.sessionStorage机制)
规则组成:
1、checkRuleStr:弱密码组成字符串,多个使用英文逗号,隔开
2、checkDateStartStr:可传入校验指定日期之后的日期字符串, 例如 校验“2021-06-30 00:00:00”之后注册的账号;不传则默认校验全部账号
3、checkDateEndStr:校验指定日期之前的账号 例如 校验“2021-07-30 00:00:00”之前注册的账号;不传则默认校验全部账号
4、增加window.sessionStorage缓存机制,同一个页面下不进行多次提示,增强用户体验度
注意:window.sessionStorage和window.localStorage 区别
(1)只要浏览器保持打开状态, sessionStorage 就会持续存在,(即同一个浏览器窗口下,即使点击刷新后依旧存在)
(2)localStorage 在浏览器重新启动后仍然存在,持久性适用于整个网站不只是它的一个页面。
前端JS示例:
/**
* 登录后校验弱密码
* @param passwordStr 旧密码加密串
* @param customerId 客户编号
* @param checkRuleStr 校验字符规则 例如 校验“123456,12345678”这种初始弱密码(多个使用英文逗号拼接),不传默认校验 123456 弱密码
* @param checkDateStartStr 校验指定日期之后的账号 例如 校验“2021-06-30 00:00:00”之后注册的账号;不传则默认校验全部账号
* @param checkDateEndStr 校验指定日期之前的账号 例如 校验“2021-07-30 00:00:00”之前注册的账号;不传则默认校验全部账号
*/
function checkWeakPwd(checkRuleStr,checkDateStartStr,checkDateEndStr) {
var passwordStr = "${password}"; //当前密码加密串
var customerId = "${customerId}"; //客户编号
var displayName = "${displayName}"; //当前用户名
var isNeedCheckPwdAgainFlag = window.sessionStorage.getItem('isNeedCheckPwdAgainFlag'); //获取缓存数据
if(!isNeedCheckPwdAgainFlag || isNeedCheckPwdAgainFlag != displayName){
if (passwordStr) {
var url = 'user/checkWeakPwd';
/*if(!checkDateStartStr) {
checkDateStartStr = "2021-06-30 00:00:00"; //校验此日期之后的注册的用户是否存在弱密码
}*/
var paramData = {
passwordStr: passwordStr,
customerId: customerId,
checkRuleStr: checkRuleStr,
checkDateStartStr: checkDateStartStr,
checkDateEndStr: checkDateEndStr,
}
console.log(passwordStr);
$.ajax({
url: url, //请求的url地址
contentType: 'application/json',
dataType: "json", //返回格式为json
async: true,//请求是否异步,默认为异步,这也是ajax重要特性
data: JSON.stringify(paramData), //参数值
type: "POST", //请求方式
beforeSend: function () {
//请求前的处理
},
success: function (req) {
//请求成功时处理
if (req.code == '0') {
layer.confirm(req.msg, {btn: ["确定修改", "稍后提醒"]}, function (index) {
layer.close(index);
if (!window.sessionStorage.getItem('isNeedCheckPwdAgainFlag') || window.sessionStorage.getItem('isNeedCheckPwdAgainFlag') != displayName) {
window.sessionStorage.setItem('isNeedCheckPwdAgainFlag', displayName); //只要浏览器保持打开状态, sessionStorage 就会持续存在, localStorage 在浏览器重新启动后仍然存在,持久性适用于整个网站不只是它的一个页面。
}
//提示修改密码
$.post('user/showChangePwdPage', function (data) {
layer.open({
type: 1,
title: "修改密码",
maxmin: true,
shadeClose: false, //点击遮罩关闭层
area: ['350px', '250px'],
content: data,
closeBtn: 0
});
}, "html");
});
} else {
//当前账号不校验弱密码
}
},
complete: function () {
//请求完成的处理
},
error: function () {
//请求出错处理
}
});
}
}
}
//后端接收规则检测示例:
/**
* 校验弱密码
* @param paramMap 参数map接收
* @return 操作结果
*/
@RequestMapping(value = "/checkWeakPwd", method = {RequestMethod.POST, RequestMethod.GET}, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public Map checkWeakPwd(@RequestBody Map paramMap, HttpServletRequest request) {
/*
* @param passwordStr 旧密码加密串
* @param customerId 客户编号
* @param checkRuleStr 校验字符规则 例如 校验“123456,12345678”这种初始弱密码(多个使用英文逗号拼接),不传默认校验 123456 弱密码
* @param checkDateStartStr 校验指定日期之后的账号 例如 校验“2021-06-30”之后注册的账号;不传则默认校验全部账号
* @param checkDateEndStr 校验指定日期之前的账号 例如 校验“2021-07-30”之前注册的账号;不传则默认校验全部账号
*/
Map result = new HashMap(); //返回结果集
String passwordStr = null;
String customerId = null;
String checkRuleStr = null;
String checkDateStartStr = null;
String checkDateEndStr = null;
if(paramMap.containsKey("passwordStr")){
passwordStr = (String)paramMap.get("passwordStr");
}
if(paramMap.containsKey("customerId")){
customerId = (String)paramMap.get("customerId");
}
if(paramMap.containsKey("checkRuleStr")){
checkRuleStr = (String)paramMap.get("checkRuleStr");
}
if(paramMap.containsKey("checkDateStartStr")){
checkDateStartStr = (String)paramMap.get("checkDateStartStr");
}
if(paramMap.containsKey("checkDateEndStr")){
checkDateEndStr = (String)paramMap.get("checkDateEndStr");
}
try {
if(StringUtils.isEmpty(checkRuleStr)){
checkRuleStr = "123456"; //默认校验 123456这种弱密码
}
boolean isNeedCheckWeakPwd = false; //默认不需要校验弱密码
if(StringUtils.isNotEmpty(passwordStr) && StringUtils.isNotEmpty(customerId)){
String accountId = ShiroUtils.getUserId();
Account account = accountService.findAccount(accountId);
Date registerDate = account.getCreatetime(); //账号注册时间
if(StringUtils.isNotEmpty(checkDateStartStr) && StringUtils.isNotEmpty(checkDateEndStr)){
Date checkDateStart = CalendarUtil.parse(checkDateStartStr,CalendarUtil.FORMAT_THREE);
Date checkDateEnd = CalendarUtil.parse(checkDateEndStr,CalendarUtil.FORMAT_THREE);
if(registerDate.getTime() >= checkDateStart.getTime() && registerDate.getTime() <= checkDateEnd.getTime()){
//注册时间在校验指定时间之内,需要校验弱密码
isNeedCheckWeakPwd = true;
}
}else if(StringUtils.isNotEmpty(checkDateStartStr) && StringUtils.isEmpty(checkDateEndStr)){
Date checkDateStart = CalendarUtil.parse(checkDateStartStr,CalendarUtil.FORMAT_THREE);
if(registerDate.getTime() >= checkDateStart.getTime()){
//注册时间在校验指定时间开始之后,需要校验弱密码
isNeedCheckWeakPwd = true;
}
}else if(StringUtils.isEmpty(checkDateStartStr) && StringUtils.isNotEmpty(checkDateEndStr)){
Date checkDateEnd = CalendarUtil.parse(checkDateEndStr,CalendarUtil.FORMAT_THREE);
if(registerDate.getTime() <= checkDateEnd.getTime()){
//注册时间在校验指定时间结束之前,需要校验弱密码
isNeedCheckWeakPwd = true;
}
}else{
//没有传入时间校验限制,则需要校验全部账号的弱密码
isNeedCheckWeakPwd = true;
}
if(isNeedCheckWeakPwd){
if(customerId.equals(account.getCustomerId())){
//相同企业才校验账号弱密码
if(StringUtils.isNotEmpty(checkRuleStr)){
boolean isWeakPwdFlag = false;
String[] checkRuleArray = checkRuleStr.split(",");
if(checkRuleArray.length > 0){
for(int i=0;i