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

黑马点评——部分代码分析

1.登录部分代码

public Result login(LoginFormDTO loginForm, HttpSession session) {//1.获得验证码和手机号String code = loginForm.getCode();String phone = loginForm.getPhone();//2.检验手机号格式if (RegexUtils.isPhoneInvalid(phone)) {return Result.fail("请输入正确电话号码");}//3.校验验证码,从redis中获得String cachecode = stringRedisTemplate.opsForValue().get(RedisConstants.LOGIN_CODE_KEY + phone);//4.验证码一致根据手机号查询用户(数据库)if (code==null||!cachecode.equals(code)) {return Result.fail("验证码错误,请重新输入");}User user = query().eq("phone",phone).one();//5.没有则新建用户if(user==null){user = createUserWithPhone(phone);}//7.生成token作为登录令牌String token = UUID.randomUUID().toString(true);//8.将user转化为hash存储 将用户保存到redis里面UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);//将userDTO转换成map,第三部分的参数是转换规则配置,第一个,如果为空值则不存储,避免脏数据,第2个,将userDTO所有字段的值都转为String,因为hash只能识别字符串Map<String, Object> map = BeanUtil.beanToMap(userDTO, new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName,fieldValue) -> fieldValue.toString()));stringRedisTemplate.opsForHash().putAll(RedisConstants.LOGIN_USER_KEY+token,map);stringRedisTemplate.expire(RedisConstants.LOGIN_USER_KEY+phone,RedisConstants.LOGIN_USER_TTL,TimeUnit.MINUTES);//9.返回tokenreturn Result.ok(token);}

2.UserHolder

专门用来在一次请求的全链路中存储和获取当前登录用户信息的工具类

登录——>拦截器——>UserHolder生成——>业务接口

package com.hmdp.utils;import com.hmdp.dto.UserDTO;
import com.hmdp.entity.User;public class UserHolder {//Threadlocal是java.lang包下面的类// 为每个线程提供独立的变量副本,实现线程之间的数据隔离,避免线程安全问题//同时还能方便的在线程的整个执行链路中共享数据private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}
//识别登录用户并存储信息,而非拦截登录请求,所以无论是否拿到token,是否查到用户,最终都放行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求头中的tokenString token = request.getHeader("authorization");//2.基于token获取redis中的用户if (StrUtil.isBlank(token)) {return true;}String userKey = RedisConstants.LOGIN_USER_KEY + token;Map<Object, Object> map = stringRedisTemplate.opsForHash().entries(userKey);//3.判断用户是否存在if(map.isEmpty()) {return true;}//5.将查询到Hash数据转换为userDTO对象UserDTO userDTO = BeanUtil.fillBeanWithMap(map, new UserDTO(), false);//6.存在,保存用户信息到ThreadLocalUserHolder.saveUser(userDTO);//7.刷新有效期stringRedisTemplate.expire(userKey,RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);//放行return true;}

3.用户签到

所用redis数据结构为bitmap,bitmap是位图,可以通过偏移量定位元素,bitmap通过最小的单位bit来进行0|1的设置,表示某个元素的值或状态,时间复杂度为O(1)

存储非常节省空间,适合一些数据量大且使用二值统计的场景。

 

http://www.jsqmd.com/news/455441/

相关文章:

  • 2026 小程序商城 SaaS 模板开发全攻略:入门到精通平台推荐 - 企业数字化改造和转型
  • 光伏传感器供应商优选:2026年这些品牌不容错过,电压传感器/电压互感器/电流传感器/传感器,传感器批发找哪家 - 品牌推荐师
  • 72小时竞标AI效果图到底有没有用
  • 2026光伏传感器市场新风向:这些厂家值得一看,漏电传感器/电压传感器/传感器/互感器/电流传感器,传感器定制有哪些 - 品牌推荐师
  • 20260309 模拟测 总结
  • 光伏行业传感器供应商口碑盘点,优选品牌推荐,漏电互感器/互感器/开口互感器/电压传感器/传感器,传感器设计排行 - 品牌推荐师
  • 小白友好:RexUniNLU快速部署指南,开箱即用的中文NLP全能工具箱
  • RexUniNLU模型安全部署指南
  • 42.接雨水
  • 如何通过微信社交优化工具实现数字社交断舍离
  • 医疗AI入门首选:MedGemma X-Ray系统部署与使用完整指南
  • 本地渲染革命:浏览器端3D纹理生成工具NormalMap-Online全解析
  • 如何通过教学环境优化工具提升学习效率?JiYuTrainer技术方案解析
  • Qwen3-ASR-0.6B模型服务化中的网络通信原理与优化
  • ASP.NET Core异步优化实战:ConfigureAwait(false)在服务端的最佳实践
  • Java 25结构化并发实战:手把手带你在Spring Boot 3.4中集成StructuredTaskScope,30分钟搞定异步编排与统一异常熔断
  • AIGlasses OS Pro 数据库课程设计案例:智能相册管理系统的设计与实现
  • StructBERT模型一键部署教程:基于Ubuntu20.04与Docker环境
  • HY-Motion 1.0模型安全:对抗样本防御策略
  • 技术写作新手必看:如何选择最适合你的技术投稿平台(2024最新版)
  • 5步搞定灵毓秀-牧神-造相Z-Turbo打包:制作可离线运行的AI绘画工具
  • 电子设计实战:如何用NPN和PNP三极管搭建一个简单的开关电路(附电路图)
  • PHPStudy Pro 8.1 + Sqli-labs 靶场搭建全攻略:解决PHP7+版本兼容性问题
  • 基于YOLOv8鹰眼目标检测的智慧园区应用:人员与车辆出入智能监控
  • 告别手动打轴!Qwen3字幕生成工具实测:会议录音秒变带时间轴字幕
  • Java SpringBoot+Vue3+MyBatis 在线学籍管理系统系统源码|前后端分离+MySQL数据库
  • mmsegmentation中ISBI2012数据集的常见问题与解决方案:从灰度图处理到模型评估
  • Android设备与macOS系统兼容性配置指南
  • GPEN图像修复镜像快速上手:3步操作,让模糊人像瞬间变清晰
  • 提升选型效率:基于tiobe8kino趋势,用快马快速生成高热度语言项目框架