工具类util
package com.cbb.util;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Component;
import java.math.BigInteger;
import java.security.MessageDigest;
/**
* Description: md5加密解密
*/
@Component
public class Md5Util {
public String md5(String pwd) throws Exception {
byte[] digest = MessageDigest.getInstance("md5").digest(pwd.getBytes("utf-8"));
String md5code = new BigInteger(1, digest).toString(16);
// 如果生成数字未满32位,需要前面补0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
// ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。
// (1)0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),
// 如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字
// 符:SOH(文头)、EOT(文尾)、ACK(确认)等;
// ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的 应用程序,而对文本显示有不同的影响。
// 2)32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
// (3)65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等
public String md5PlusSalt(String keyword) {
// md5加密
String md5 = DigestUtils.md5Hex(keyword);
// md5+盐
char[] cArray = md5.toCharArray();
for (int i = 0; i < cArray.length; i++) {
if (cArray[i] >= 48 && cArray[i] <= 57) {
cArray[i] = (char) (105 - cArray[i]);
}
}
// 都可以使用
return String.valueOf(cArray);
// return "".valueOf(cArray);
}
// 解密+盐
public String md5MinusSalt(String md5) {
char[] cArray = md5.toCharArray();
for (int i = 0; i < cArray.length; i++) {
if (cArray[i] >= 48 && cArray[i] <= 57) {
cArray[i] = (char) (105 - cArray[i]);
}
}
return String.valueOf(cArray);
// return "".valueOf(cArray);
}
}
业务层 Imple
package com.cbb.serviceimple;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.cbb.entity.Login;
import com.cbb.mapper.LoginMapper;
import com.cbb.service.LoginService;
import com.cbb.util.Md5Util;
import lombok.RequiredArgsConstructor;
/**
* 这是一个关于用户登录信息业务处理的实现类,处理业务逻
*
* @author 陈斌斌
* @Date 2022年5月11日 09点25分
*
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class LoginServiceImple implements LoginService {
/**
* 用户登录的接口
*/
private final LoginMapper loginMapper;
/**
* 用于请求
*/
private final HttpServletRequest request;
/**
* 用户登录密码进行加密
*/
private final Md5Util md5Util;
/**
* session里面有存储的会话
*/
private HttpSession session;
/**
* 查询用户是否存在,并且账号与密码是否正确
*
* @param login
* @return
*/
@Override
public Map<String, Object> selLoginName(Login login) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
UpdateWrapper<Login> updateWrapper = new UpdateWrapper<Login>();
QueryWrapper<Login> queryWrapper = new QueryWrapper<Login>();
if (login.getUserName() != null && !"".equals(login.getUserName())) {
queryWrapper.eq("userName", login.getUserName());
}
Login logins = loginMapper.selectOne(queryWrapper);
Map<String, Object> map = new HashMap<String, Object>();
if (logins != null) {
boolean isTrue = (login.getUserName() != null && !"".equals(login.getUserName()))
&& (login.getPassword() != null && !"".equals(login.getPassword()));
if (isTrue) {
// 密码进行加盐
String pwd = md5Util.md5PlusSalt(login.getPassword());
// 加盐后进行解密
String beginPwd = md5Util.md5MinusSalt(pwd);
boolean isTruePwd = login.getUserName().equals(logins.getUserName())
&& beginPwd.equals(logins.getPassword());
if (isTruePwd) {
map.put("code", "200");
map.put("message", "登录成功");
map.put("data", login);
if (logins.getIsLock() < 1) {
updateWrapper.set("islock", 0);
updateWrapper.set("number", 0);
updateWrapper.set("updatetime", sdf.format(new Date()));
updateWrapper.eq("username", logins.getUserName());
loginMapper.update(null, updateWrapper);
session = request.getSession();
session.setAttribute("uname", login);
// 30分钟内不操作系统页面需要重新登录
session.setMaxInactiveInterval(1800);
} else {
map.put("code", "500");
map.put("message", "密码被锁定,请联系管理员进行解锁");
}
} else {
if (logins.getNumber() > 4) {
login.setNumber(logins.getNumber() + 1);
updateWrapper.set("updatetime", sdf.format(new Date()));
updateWrapper.set("number", login.getNumber());
updateWrapper.set("islock", 1);
updateWrapper.eq("username", logins.getUserName());
loginMapper.update(null, updateWrapper);
map.put("code", "500");
map.put("message", "密码被锁定,请联系管理员进行解锁");
} else {
login.setNumber(logins.getNumber() + 1);
updateWrapper.set("updatetime", sdf.format(new Date()));
updateWrapper.set("number", login.getNumber());
updateWrapper.set("islock", 0);
updateWrapper.eq("username", logins.getUserName());
loginMapper.update(null, updateWrapper);
map.put("code", "500");
map.put("message", "账户或密码错误,请重新输入");
map.put("data", login.getNumber() - 1);
}
}
} else {
map.put("code", "500");
map.put("message", "用户或者密码不能为空");
}
} else {
map.put("code", "500");
map.put("message", "用户不存在");
}
return map;
}
}