前言:项目的抽奖系统
项目是使用spring集成session,可以看这个博主的这篇文章
刚刚开始不理解读到这篇文章以后都明白了
1、登录
- 第一次使用到Session的请求产生,则创建Session
- 结束
- 浏览器关闭,则失效
- Session超时,则失效
- session.setMaxInactiveInterval(seconds);//设置最大有效时间(单位:秒)
- 手工销毁,则失效
- session.invalidate();//登录退出,销毁
用户登录写在session,可以在request中获取,然后使用redis判断密码错误的次数。
@PostMapping("/login")
@ApiOperation(value = "登录")
@ApiImplicitParams({
@ApiImplicitParam(name="account",value = "用户名",required = true),
@ApiImplicitParam(name="password",value = "密码",required = true)
})
//TODO:任务3.1-登录模块-用户登录
public ApiResult login(HttpServletRequest request, @RequestParam String account,@RequestParam String password) {
//先判断账号也没有被锁住
Integer errortimes = (Integer) redisUtil.get(RedisKeys.USERLOGINTIMES+account);
if (errortimes != null && errortimes >= 5){
return new ApiResult(0, "密码错误5次,请5分钟后再登录",null);
}
QueryWrapper<CardUser> wrapper = new QueryWrapper<>();
wrapper.eq("uname",account).eq("passwd",PasswordUtil.encodePassword(password));
List<CardUser> users = userService.list(wrapper);
if (users != null && users.size() > 0) {
CardUser user = users.get(0);
//信息脱敏,不要将敏感信息带入session以免其他接口不小心泄露到前台
user.setPasswd(null);
user.setIdcard(null);
//获取session
HttpSession session = request.getSession();
session.setAttribute("user",user);
return new ApiResult(1, "登录成功",user);
} else {
//错误计数,5次锁定5分钟
redisUtil.incr(RedisKeys.USERLOGINTIMES+account,1);
redisUtil.expire(RedisKeys.USERLOGINTIMES+account,60 * 5);
return new ApiResult(0, "账户名或密码错误",null);
}
}
2、退出登录
@GetMapping("/logout")
@ApiOperation(value = "退出")
public ApiResult logout(HttpServletRequest request){
//TODO:任务3.2-登录模块-用户退出
HttpSession session = request.getSession();
if (session != null){
session.invalidate();
}
return new ApiResult(1, "退出成功",null);
}