登录需求:
使用SSM
用户根据用户名和密码及验证码完成登录,用户在登录时如果密码出现连续输入三次错误时该账户进行锁定,锁定时间3分钟,在锁定期间内该用户将不能登录且提示用户账户锁定中.当用户登录时前状态为锁定状态但此刻操作登录时已超过锁定时间该账户可进行解锁.刚解锁的用户状态再次出现密码错误时从新计算失败次数.
数据库表
字段要有
id username password 锁定时间 锁定状态 计数
1.使用自动逆向工程生产实体,模板和mapper
2.在user类中加入两个常量
//未锁定状态
public static final Integer UNLOCK_STATUS=0;
//锁定状态
public static final Integer LOCK_STATUS=1;
编写一个返回类
public class ServiceResult<T> {
//成功码
public static final Integer CODE=100;
//成功信息
public static final String MSG="success";
//状态码 100成功 200失败 ..
private Integer code;
//信息
private String msg;
//数据
private T data;
service
@Service
public class LoginServiceImpl implements LoginService{
@Autowired
private UserMapper userMapper;
//登录功能
@Override
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public ServiceResult<User> doLogin(User uservo) {
ServiceResult<User> result = new ServiceResult<>();
UserExample userExample = new UserExample();
Criteria criteria = userExample.createCriteria();
//根据用户名去查询
criteria.andUsernameEqualTo(uservo.getUsername());
List<User> userList = userMapper.selectByExample(userExample);
User userpo = userList.isEmpty()?null:userList.get(0);
//如果没有此用户名就返回
if (userpo==null) {
result.setCode(200);
result.setMsg("用户不存在或密码错误");
return result;
}
//有用户名判断是否为锁定状态
if (userpo.getStatus().equals(User.LOCK_STATUS)) {
//判断锁定时间
if (userpo.getStatusdate().after(new Date())) {
result.setCode(201);
result.setMsg("用户已被锁定,请三分钟后再登录");
return result;
}else {
//过了锁定时间就解锁
userpo.setStatus(User.UNLOCK_STATUS);
userpo.setCount(0);
userMapper.updateByPrimaryKeySelective(userpo);
}
}
//判断密码是否正确
if (!userpo.getPassword().equals(uservo.getPassword())) {
//不正确 判断计数是否小于3
if (userpo.getCount()<3) {
userpo.setCount(userpo.getCount()+1);
userMapper.updateByPrimaryKeySelective(userpo);
result.setCode(200);
result.setMsg("用户不存在或密码错误");
return result;
}else {
//锁定用户
userpo.setStatus(User.LOCK_STATUS);
//设置锁定时间为当前时间加3
userpo.setStatusdate(DateUtils.addMinutes(new Date(), 3));
userpo.setCount(0);
userMapper.updateByPrimaryKeySelective(userpo);
result.setCode(201);
result.setMsg("用户已被锁定,请三分钟后再登录");
return result;
}
}
//登录成功
userpo.setCount(0);
userMapper.updateByPrimaryKeySelective(userpo);
BeanUtils.copyProperties(userpo, uservo);
uservo.setPassword(null);
result.setCode(ServiceResult.CODE);
result.setMsg(ServiceResult.MSG);
result.setData(uservo);
return result;
}
}
controller
@Controller
@RequestMapping("")
public class LoginController {
@Autowired
private LoginService loginService;
@RequestMapping("/login")
public String login(User uservo,HttpSession session,Model model) {
ServiceResult<User> result = loginService.doLogin(uservo);
// 100 登录成功
if (result.getCode().equals(ServiceResult.CODE)) {
model.addAttribute("msg", result.getMsg());
session.setAttribute("user", result.getData());
return "redirect:/index";
}
//登录失败 将信息返回
model.addAttribute("username", uservo.getUsername());
model.addAttribute("msg", result.getMsg());
return "/login";
}
}