一般给公司做网站用什么软件,高职考技能考网站建设试题,网页编程语言有哪几种,凡科建站平台深入了解Redis-实战篇-短信登录 一、故事背景二、知识点主要构成2.1、短信登录2.1.1、生成随机短信验证码引入maven依赖生成验证码 2.1.2、实现登录校验拦截器2.1.3、基于Redis实现短信登录2.1.3.1、发送验证码时存入Redis2.1.3.2、登录时校验验证码 2.1.4、解决状态登录刷新的… 深入了解Redis-实战篇-短信登录 一、故事背景二、知识点主要构成2.1、短信登录2.1.1、生成随机短信验证码引入maven依赖生成验证码 2.1.2、实现登录校验拦截器2.1.3、基于Redis实现短信登录2.1.3.1、发送验证码时存入Redis2.1.3.2、登录时校验验证码 2.1.4、解决状态登录刷新的问题 三、总结提升 一、故事背景
最近在系统的回顾redis相关的知识总结成系列博客方便回顾也希望大家能给出意见帮助我更快的成长本篇博客主要介绍使用Redis如何实现短信登录功能 系列 深入了解Redis-基础篇
二、知识点主要构成
2.1、短信登录
2.1.1、生成随机短信验证码
引入maven依赖
Hutool是一个小而全的Java工具类库通过静态方法封装降低相关API的学习成本提高工作效率使Java拥有函数式语言般的优雅让Java语言也可以“甜甜的”。 Hutool的目标是使用一个工具方法代替一段复杂代码从而最大限度的避免“复制粘贴”代码的问题彻底改变我们写代码的方式。
!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.7.17/version/dependency生成验证码
一般随机数每个公司都会自己的生成规则,包括个数,生成方式大家只需要知道使用hutool也可以简单快速生成随机数即可 部分生成方式如下 引入hutool包之后直接使用RandomUtil类的随机数字方法生成就可以了还可自定义生成位数
//生成验证码
String code RandomUtil.randomNumbers(6);
RandomUtil.randomString(10) //小写字母数字
RandomUtil.randomStringUpper(10) //大写字母数字
RandomUtil.randomNumbers(10) //数字
RandomUtil.randomStringWithoutStr(10,0123456789) //不含有0123456789
RandomUtil.randomString(abc,10) //只含有abc
RandomUtil.randomChar() // 生成小写字母数字中一个字符
RandomUtil.randomNumber() // 生成0123456789中一个字符
RandomUtil.randomChar(-!?) // 生成-!?中一个字符这里以6位为例使用String code RandomUtil.randomNumbers(6);
2.1.2、实现登录校验拦截器
public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.判断是否需要拦截ThreadLocal中是否有用户if (UserHolder.getUser() null) {// 没有需要拦截设置状态码response.setStatus(401);// 拦截return false;}// 有用户则放行return true;}
}2.1.3、基于Redis实现短信登录
2.1.3.1、发送验证码时存入Redis
public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合返回错误信息return Result.fail(手机号格式错误);}// 3.符合生成验证码String code RandomUtil.randomNumbers(6);// 4.保存验证码到 sessionstringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);// 5.发送验证码log.debug(发送短信验证码成功验证码{}, code);// 返回okreturn Result.ok();}2.1.3.2、登录时校验验证码
这里首先对手机号进行格式校验通过后从Redis获取验证码并校验通过后去查询该用户如果存在直接将用户信息存到redis中如果不存在则先去执行注册操作进行注册之后将用户信息存入Redis中方便下次获取
public Result login(LoginFormDTO loginForm, HttpSession session) {// 1.校验手机号String phone loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合返回错误信息return Result.fail(手机号格式错误);}// 3.从redis获取验证码并校验String cacheCode stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY phone);String code loginForm.getCode();if (cacheCode null || !cacheCode.equals(code)) {// 不一致报错return Result.fail(验证码错误);}// 4.一致根据手机号查询用户 select * from tb_user where phone ?User user query().eq(phone, phone).one();// 5.判断用户是否存在if (user null) {// 6.不存在创建新用户并保存user createUserWithPhone(phone);}// 7.保存用户信息到 redis中// 7.1.随机生成token作为登录令牌String token UUID.randomUUID().toString(true);// 7.2.将User对象转为HashMap存储UserDTO userDTO BeanUtil.copyProperties(user, UserDTO.class);MapString, Object userMap BeanUtil.beanToMap(userDTO, new HashMap(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) - fieldValue.toString()));// 7.3.存储String tokenKey LOGIN_USER_KEY token;stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);// 7.4.设置token有效期stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.返回tokenreturn Result.ok(token);}2.1.4、解决状态登录刷新的问题
这里主要利用Redis实现和session一样的功能用户每次访问都会刷新该用户的token在redis中的有效时间
Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//请求头中获取tokenString token request.getHeader(authorization);if (StrUtil.isBlank(token)){// 不存在response.setStatus(401);// 拦截return false;}String key RedisConstants.LOGIN_USER_KEY;//基于token从redis中获取用户MapObject,Object userMap stringRedisTemplate.opsForHash().entries(key token);if (userMap.isEmpty()){// 不存在response.setStatus(401);// 拦截return false;}UserDTO userDTO BeanUtil.fillBeanWithMap(userMap,new UserDTO(),false);//保存用户信息到ThreadLocalUserHolder.saveUser(userDTO);stringRedisTemplate.expire(key,RedisConstants.LOGIN_USER_TTL, TimeUnit.MINUTES);//放行return true;}三、总结提升
短信验证码修改为以手机号为key验证码为value保存在redis中在用户使用手机号登录时获取redis中的验证码和请求参数中的验证码比对一致则去库里查该手机号的用户是否存在不存在则新建用户并把该用户对象存在在redis中。校验登录状态是使用HandlerInterceptor拦截器实现的在此之前需要配置拦截哪些请求不拦截哪些请求从客户端的请求头中获取token信息并从redis中获取用户信息 为空返回401状态不为空则把用户信息存储在ThreadLocal中还把验证码和用户信息设置有效时间时间一过则退出用户登录。在请求处理完之后销毁用户信息。
如果本篇博客对您有一定的帮助大家记得留言点赞收藏哦。