当前位置: 首页 > article >正文

java-6验证码校验

1.修改SysUserServiceImpl中的login方法

在login方法中添加校验图片验证码的流程

应该将校验验证码放在校验账号和密码之前,可以减少数据库操作,提高性能

思路:

1.获取图片验证码在redis中的key

2.通过key获取验证码的value

3.如果为空或者不一致,提示用户校验失败(不区分大小写)

这里提示通过抛出自定义错误来进行

4.如果一致删除redis中的验证码

package com.atguigu.spzx.manager.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson.JSON;
import com.atguigu.spzx.common.exception.GuiguException;
import com.atguigu.spzx.manager.mapper.SysUserMapper;
import com.atguigu.spzx.manager.service.SysUserService;
import com.atguigu.spzx.model.dto.system.LoginDto;
import com.atguigu.spzx.model.entity.system.SysUser;
import com.atguigu.spzx.model.vo.common.Result;
import com.atguigu.spzx.model.vo.common.ResultCodeEnum;
import com.atguigu.spzx.model.vo.system.LoginVo;
import com.atguigu.spzx.model.vo.system.ValidateCodeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class SysUserServiceImpl implements SysUserService {
    @Autowired()
    private SysUserMapper sysUserMapper;
    @Qualifier("redisTemplate")
    @Autowired
    private RedisTemplate redisTemplate;//通过Autowired注解注入redis实例

    //登录方法
    @Override
    public LoginVo login(LoginDto loginDto) {
        //获取图片验证码在redis中的key
        String valiDateCodeKey = loginDto.getCodeKey();
        //通过key获取验证码的value
        String valiDateCodeValue = loginDto.getCaptcha();
        String valiDateCodeValueRedis = redisTemplate.opsForValue().get("user:validateCode"+valiDateCodeKey).toString();
        //如果为空或者不一致,提示用户校验失败(不区分大小写)
        if(StrUtil.isEmpty(valiDateCodeValue)|| !StrUtil.equalsIgnoreCase(valiDateCodeValue,valiDateCodeValueRedis)){
            throw new GuiguException(ResultCodeEnum.VALIDATECODE_ERROR);
        }
        //如果一致删除redis中的验证码
        redisTemplate.delete(valiDateCodeKey);
        //1.获取用户名
        String userName = loginDto.getAccount();
        //2.从数据库查询对应用户信息
        SysUser sysUser = sysUserMapper.selectUserInfoByUserName(userName);
        //3.如果查询不到用户信息,返回错误信息
        if (sysUser == null) {
            //throw  new RuntimeException("用户名不存在");
            throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
        }
        //4.如果根据用户名查询到用户信息存在
        //5.获取输入的密码,比较输入的密码与数据库的密码是否一致,如果密码一致登录成功,如果密码不一致登录失败
        String input_password = loginDto.getPassword();
        String password = sysUser.getPassword();
        //将输入的密码加密后与数据库中的密码比较,使用DigestUtils.md5Digest工具类加密
        String md5_password = DigestUtils.md5DigestAsHex(input_password.getBytes());
        if (!password.equals(md5_password)) {
            //throw new RuntimeException("密码错误");
            throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
        }
        //6.登录成功生成用户唯一标识token
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        //7.把登录成的用户信息存放到redis里面
        redisTemplate.opsForValue()
                .set("user:login" + token, JSON.toJSONString(sysUser), 7, TimeUnit.DAYS);
        //8.返回LoginVo对象
        LoginVo loginVo = new LoginVo();
        loginVo.setToken(token);
        return loginVo;
    }

}

这里注意:

SysUserServiceImpl类中的redis实例的key和value类型必须声明的和ValidateCodeServiceImpl类中一样

否则无法通过redisTemplate.opsForValue().get获取值,值永远为null


http://www.kler.cn/a/444980.html

相关文章:

  • winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭
  • linux----系统i/o
  • 模具生产过程中的标签使用流程图
  • @pytest.fixture() 跟 @pytest.fixture有区别吗?
  • 02、服务器的分类和开发项目流程
  • PHPUnit使用指南:编写高效的单元测试
  • 如何通过HTTP API新建Collection
  • 南城云趣:智能云平台,杜绝电动车充电安全隐患
  • Oracle创建逻辑目录
  • 网络安全概论——防火墙原理与设计
  • 【算法练习】尺取法——答案
  • 【Linux篇】基础开发工具-编译器gcc/g++
  • 算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II
  • Restaurants WebAPI(一)—— clean architecture
  • ABeam 德硕 | ABeam旗下艾宾信息技术开发(上海)有限公司大连分公司数交会之行全景回顾
  • 51c视觉~合集33
  • 【GESP】C++二级考试大纲知识点梳理, (4)流程图
  • metagpt中ActionNode的用法
  • 如何保证开源AI呼入机器人和AI呼出机器人的数据安全性?
  • 系统架构设计师 (论文范文 --- 论基于rest服务的web应用系统设计)
  • 解锁移动设备管理新技能-RayLink远程控制手机
  • 在Centos7上安装MySQL数据库 How to install MySQL on Centos 7
  • Android Compose list 下拉刷新、上拉加载更多
  • JS实现在线预览HTML文件
  • 分布式刚度编织,让可穿戴触觉更出色 ——Haptiknit
  • Visio——同一个工程导出的PDF文件大小不一样的原因分析