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

Spring Boot + Mybatis Plus实现登录注册

Spring Boot 实现登录注册

1. 注册

业务逻辑

  1. 客户端输入注册时需要的用户参数,比如:账户名、密码、确认密码、其他
  2. 服务端接收到客户端的请求参数进行校验,然后判断是否有误,有误的地方就将错误信息抛出
  3. 将密码进行加密之后存储到数据库中,切记不能以明文的方式存入
  4. 返回用户的id作为注册成功之后的返回信息

具体实现 + 代码

  1. controller 层

    • 封装请求参数 UserRegisterRequest
    • 判断请求参数是否为空
    • 调用service的注册方法将请求参数传递给注册方法
    @PostMapping("/register")public BaseResponse<Long> userRegister(@RequestBody UserRegisterRequest userLoginRequest) {if(userLoginRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}String userAccount = userLoginRequest.getUserAccount();String userPassword = userLoginRequest.getUserPassword();String checkPassword = userLoginRequest.getCheckPassword();if(StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}long result = userService.userRegister(userAccount, userPassword, checkPassword);return ResultUtils.success(result);}
    
  2. service 层

    • 判断请求参数对象是否为空 使用 StringUtils工具进行判断[需要下载org.apache.commons-lang3依赖]
    • 校验参数:
      • 账户名长度 < 3
      • 密码长度 < 4
      • 密码和确认密码是否相等
      • 用户名、密码、确认密码是否为空
    • 创建一个查询对象来确保账户是唯一的不能重复注册
    • 密码加密
    • 创建一个user对象,将用户信息存储到数据库中
    @Overridepublic long userRegister(String userAccount, String userPassword, String checkPassword) {if(StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}if(userAccount.length() < 3) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "账户名长度太短");}if(userPassword.length() < 4) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码长度太短");}if(!userPassword.equals(checkPassword)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "校验密码不相等");}// 加锁防止恶意注册操作synchronized (userAccount.intern()) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("userAccount", userAccount);Long count = this.baseMapper.selectCount(queryWrapper);if (count > 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "该账号已注册");}String newUserPassword = DigestUtils.md5DigestAsHex((SLAT + userPassword).getBytes());User user = new User();user.setUserAccount(userAccount);user.setUserPassword(newUserPassword);boolean save = this.save(user);if (!save) {throw new BusinessException(ErrorCode.OPERATION_ERROR, "用户注册失败");}return user.getId();}}
    
  3. 测试

    image-20240606111153586

    通过观察服务器的响应,可以看到当前用户信息注册成功

    image-20240606111300500

    数据库中也能查询到该条用户数据

2. 登录

业务逻辑

  1. 用户输入登录时需要传递的参数:用户名、密码
  2. 服务器收到参数之后取出进行校验
  3. 创建一个queryWrapper进行查询,查询当前账户是否是唯一的,不允许未被注册就能登录的情况
  4. 将用户的登录信息存储到登录态中
  5. 返回脱敏后的用户信息

具体实现 + 代码

  1. controller层

    • 封装一个用户登录请求的类,里面用于存入用户登陆时的请求参数

    • 取出所有参数判断是否为空

    • 调用service层中用户登录的方法

      @PostMapping("/login")
      public BaseResponse<UserLoginVO> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {if(userLoginRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}String userAccount = userLoginRequest.getUserAccount();String userPassword = userLoginRequest.getUserPassword();if(StringUtils.isAnyBlank(userAccount, userPassword)) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}UserLoginVO result = userService.userLogin(userAccount, userPassword, request);return ResultUtils.success(result);
      }
      
  2. service层

    • 校验参数是否为空

    • 创建一个queryWrapper进行查询,是否有和当前账户和密码一致的数据库信息(注意这里的密码必须是加密之后的密码进行查询,否则会查不到)

    • 不存在的话就说明当前用户未注册

    • 将用户信息存储到登录态中

    • 返回脱敏之后的用户信息

      @Override
      public UserLoginVO userLogin(String userAccount, String userPassword, HttpServletRequest request) {// 1. 对参数进行校验 账户和密码是否为空if(StringUtils.isAnyBlank(userAccount, userPassword)) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}// 2. 将用户的密码进行加密 有的话就登录成功    查询数据库中的账户是否存在   不存在就报错String md_userPassword = DigestUtils.md5DigestAsHex((SLAT + userPassword).getBytes());QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("userAccount", userAccount);queryWrapper.eq("userPassword", md_userPassword);User user = this.baseMapper.selectOne(queryWrapper);if(user == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "当前用户未注册");}// 3. 将用户信息存储到登录态中request.getSession().setAttribute(USER_LOGIN_STATE, user);// 3. 返回当前用户的所有信息(脱敏返回)return this.getUserLoginVO(user);
      }
      
  3. 测试

    输入前面我们注册的用户信息进行登录测试

    image-20240612185837959

    可以看出我们的登录功能是没有问题的,并且我们的request中也存储了用户的登录态信息

    image-20240612190111775

总结:

​ 注册登录是一个软件的基本功能,主要需要注意里面service层中的校验逻辑,我这里的校验比较的简单,只是实现了基础的东西,如果更复杂的应用可能会有更加严格细致的校验。后续大家也可以考虑进行扩展,比如:将用户的登录信息存储存储到session中实现多个客户端共享一个用户的信息,不用重复登录;另外也可以考虑将用户的登录改为单设备登录,这适用于一些用户充值了vip之后只能在单设备登录的场景。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UbuntuServer 22.04.4安装GitLab
  • 生成式人工智能 - 本地windows 11 + PyCharm运行stable diffusion流程简述
  • C++类与对象(拷贝与类的内存管理)
  • Ubuntu 22.04 下 CURL 分块上传文件(C++)
  • AIRNet模型使用与代码分析(All-In-One Image Restoration Network)
  • 【小白学Python】自定义图片的生成(二)
  • 用Python绘制yolo训练结果比较图-论文需要
  • 鸿蒙轻内核A核源码分析系列六 MMU协处理器(1)
  • 【稳定检索/投稿优惠】2024年智慧金融与财务管理国际会议(SFFM 2024)
  • C#操作MySQL从入门到精通(21)——删除数据
  • C# 设置PDF表单不可编辑、或提取PDF表单数据
  • 开发TEE的踩坑之配置PCCS
  • 子域名爆破工具
  • 拜托:不要像鲍勃大叔那样重构
  • eNSP学习——RIP路由协议的汇总
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 78. Subsets
  • css布局,左右固定中间自适应实现
  • css选择器
  • js递归,无限分级树形折叠菜单
  • Redis 懒删除(lazy free)简史
  • select2 取值 遍历 设置默认值
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 爱情 北京女病人
  • 程序员该如何有效的找工作?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 我与Jetbrains的这些年
  • 线性表及其算法(java实现)
  • 译自由幺半群
  • 怎么将电脑中的声音录制成WAV格式
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​人工智能书单(数学基础篇)
  • (1)Nginx简介和安装教程
  • (10)STL算法之搜索(二) 二分查找
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Forward) Music Player: From UI Proposal to Code
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (SERIES12)DM性能优化
  • (二)pulsar安装在独立的docker中,python测试
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (十一)图像的罗伯特梯度锐化
  • (四)linux文件内容查看
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat文件调用java类的main方法
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 4.0并行库实用性演练