实现分析

验证码功能
Controller
@ApiOperation(value = "验证码", notes = "验证码")@GetMapping(value = "/captcha", produces = "image/png")public void captcha(@RequestParam(value = "key") String key, HttpServletResponse response) throws IOException {this.authService.createCaptcha(key, response);}
AuthService
private static final String CAPTCHA_REDIS_PREFIX = "CAPTCHA_";@Overridepublic void createCaptcha(String key, HttpServletResponse response) throws IOException {//1. 生成验证码,指定宽、高、字符个数、干扰线条数LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(115, 42, 0, 10);//1.1 设置生成器为数字计算验证码生成器并且指定参与计算最大数字位数为1,也就是个位数相加lineCaptcha.setGenerator(new MathGenerator(1));//1.2 获取生成的验证码值String code = lineCaptcha.getCode();//2. 将验证码的值写入到redis,有效期为1分钟String redisKey = CAPTCHA_REDIS_PREFIX + key;this.stringRedisTemplate.opsForValue().set(redisKey, code, Duration.ofMinutes(1));//3. 输出到页面,设置页面不缓存response.setHeader(HttpHeaders.PRAGMA, "No-cache");response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache");response.setDateHeader(HttpHeaders.EXPIRES, 0L);lineCaptcha.write(response.getOutputStream());}
实现登录
AuthService
/*** 登录** @param login 用户登录信息* @return 登录结果*/@Overridepublic R<LoginDTO> login(LoginParamDTO login) {//1. 校验参数if (ObjectUtil.hasEmpty(login.getCode(), login.getKey())) {return R.error("验证码不能为空");}if (ObjectUtil.hasEmpty(login.getAccount(), login.getPassword())) {return R.error("用户名、密码不能为空");}//2. 校验验证码String redisKey = CAPTCHA_REDIS_PREFIX + login.getKey();String redisValue = this.stringRedisTemplate.opsForValue().get(redisKey);if (ObjectUtil.isEmpty(redisValue)) {return R.error("验证码已过期");}//验证码只能使用一次,所以需要将验证码删除this.stringRedisTemplate.delete(redisKey);boolean verify = new MathGenerator().verify(redisValue, login.getCode());if (!verify) {return R.error("验证码不正确");}//3. 校验用户名密码,校验通过生成tokenreturn this.login(login.getAccount(), login.getPassword());}/*** 登录获取token** @param account 账号* @param password 密码* @return 登录信息*/public R<LoginDTO> login(String account, String password) {//调用权限管家接口,传递用户名和密码Result<LoginDTO> result = this.authTemplate.opsForLogin().token(account, password);if (ObjectUtil.equal(result.getCode(), 0)) {//登录成功return R.success(result.getData());}//登录失败return R.error(result.getMsg());}
Controller
/*** 管理端登录** @param login 登录信息* @return 用户信息*/@PostMapping(value = "/login")@ApiOperation(value = "登录", notes = "登录")public R<LoginDTO> login(@RequestBody LoginParamDTO login) {return this.authService.login(login);}