黑马点评项目总结(未完待续)

news2024/11/13 13:52:10

黑马点评项目总结

  • 0. 整体架构
  • 1. 短信登录模块
    • 1.1 基于session
      • (1)后台发送验证码Code
      • (2)登录、注册
      • (3)校验登录状态
    • 1.2 基于Redis
      • (1)后台发送验证码Code
      • (2)登录、注册
      • (3)校验登录状态(更新Token有效时间)
    • 1.3 补充
  • 2. 商户缓存
  • 报错:
    • 1. 给

0. 整体架构

在这里插入图片描述

1. 短信登录模块

1.1 基于session

(1)后台发送验证码Code

  1. 客户端提交手机号
  2. 后台检验手机号是否合法,不合法就返回错误信息
  3. 合法就用工具类随机生成验证码吗,并将验证码保存到 session 中,用于第二个环节的验证;
  4. 向用户发送验证码

(2)登录、注册

  1. 用户提交手机号和验证码
  2. 后台再次验证手机号是否合法(两次请求,都要验证),如果不合法就报错
  3. 取出 session 中的验证码Code,和用户传的Code比较,不一样则报错
  4. 一致则通过手机号从数据库查询User对象,如果User为空就用Mybatis添加数据库;
  5. 不管有没有user,最后都把user对象放到 session 中,用于后序验证;

(3)校验登录状态

前端跳转 /user/me页面,先在拦截器进行校验登录状态

  1. 定义一个拦截器类,实现HandlerInterceptor接口,重写preHandle方法;然后在SpringMvcConfig中配置拦截器,排除不需要被拦截的地址;
  2. 在拦截器的preHandle方法中,获取session中的user对象
  3. 如果user对象不存在则表明没有通过第二个环节,报错401(未授权)
  4. 如果存在,这里为了从缓存快速读取用户信息,一方面为了安全性,就把user对象存入 Threadlocal,后序用户从ThreadLocal直接读取信息更安全;
  5. return true 放行请求,访问个人信息页面;

使用Session来完成登录时,登录凭证就是sessionID,Tomcat服务器会自动维护SessionID;

问题
当Tocmat服务器扩张成一个服务器集群,而Tomcat之间不共享session存储空间;
当浏览器发送请求到 Nginx,由Nginx进行 负载均衡 时,同一个浏览器的不同请求就可能发往不同的Tomcat服务器,这样数据读取就出问题;

解决
Tomcat使用session互相拷贝;
①多台服务器拷贝浪费空间 ②拷贝需要时间,有延迟(服务器是进程,进程通信效率低)

所以使用缓存服务器专门用来存数据,让Tomcat都可以去访问;

1.2 基于Redis

(1)后台发送验证码Code

  1. 客户端提交手机号
  2. 后台检验手机号是否合法,不合法就返回错误信息
  3. 合法就用工具类随机生成验证码吗,使用StringRedisTemplate.opsForValue()将验证码保存到 Redis 中,用于第二个环节的验证;
  4. 向用户发送验证码

Redis中存的第一类数据(验证码):key 为手机号+“前缀”(保证唯一性),value 就是验证码;

(2)登录、注册

  1. 用户提交手机号和验证码
  2. 后台再次验证手机号是否合法(两次请求,都要验证),如果不合法就报错
  3. 用手机号取出之前存在Redis中的验证码Code,和用户提交的Code对比,不一样则返回错误;
  4. 一致则通过手机号从数据库查询User对象,如果User为空就用Mybatis添加数据库;
  5. 不管有没有user,都需要将user对象存到Redis中;
    使用UUID工具类生成一串 Token,将Token作为 key ;将user对象转换为Map格式作为 value,使用StringRedisTemplate.opsForHash().putAll()把user对象存入 Redis
    此时Token就是登陆凭证;
  6. 使用StringRedisTemplate.expire() 方法设置Token的有效时间;
  7. 将登陆凭证Token返回给前端,存储到浏览器中,以后每次访问都放在【请求头】中;

前端会用一个sessionStorage() 将Token存到浏览器中,以后每次访问都在请求头中带着Token;

(3)校验登录状态(更新Token有效时间)

前端跳转 /user/me 页面,先在拦截器进行校验登录状态

  1. 定义一个拦截器类,实现HandlerInterceptor接口,重写preHandle方法;然后在SpringMvcConfig中配置拦截器,排除不需要被拦截的地址;
  2. 在拦截器的preHandle方法中,从request中getHeader()读取请求头中的**Token**,如果不存即第二个环节没通过,返回错误401(未授权);
  3. 通过Token从Redis中取出user的Map,如果Map不存在,也返回错误401;
  4. 存在则使用BeanUtil 将Map转换为对象格式,存入 Threadlocal(方便和安全性);
  5. StringRedisTemplate.expire() 更新Token的有效期;
  6. return true 放行请求,访问个人信息页面;

注意Redis存的是两类数据,一个是 手机号–Code ,另一个是Token–User
在这里插入图片描述

1.3 补充

问题:用户登录状态的保持主要靠的是拦截器中更新Token有效时间,但是访问 shop店铺、blog博客时没有更新Tokend有效时间 !

解决:再增加一个拦截器 !
让第一个拦截器对所有请求操作,获取Token,保存User用户到ThreadLocal
第二个拦截器来实现拦截功能;

  1. 第一个拦截器:(对所有请求页面拦截)
    如果发现Token为空,则直接return true放行到第二个拦截器;
    通过Token获取User,不存在则放行,
    将User存储放在第一个拦截器;
  2. 第二个拦截器:(对部分请求页面拦截)
    判断ThreadLocal中是否有用户,没有则拦截,有则放行;

配置拦截器
通过设置拦截器的 order,来控制拦截器的执行顺序!
oder越小,优先级越高;
在这里插入图片描述

2. 商户缓存

报错:

1. 给

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ur3+robotiq ft sensor+robotiq 2f 140配置rviz仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 在安装sensor和gripper之前,先简单配置一下UR机械臂的仿真环境,可参考这篇博…

零入门kubernetes网络实战-16->使用golang给docker环境下某个容器里添加一个额外的网卡

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 上一篇文章,我们使用了golang在veth pair链接的网络命名空间里添加了网卡, 本篇文章,我尝试,在docker环境下…

新建idea项目

目录IDEA系列之创建各种项目 https://blog.csdn.net/LOVEQD123/article/details/105886077 idea 创建项目的三种方式 https://blog.csdn.net/weixin_50034122/article/details/118754521 创建空项目 https://blog.csdn.net/qq_44537956/article/details/123075134 创建 spri…

百度百科词条怎么做?百度百科词条创建攻略分享

只要是想要将自己宣传出去的企业或是个人,都建议创建属于自己的百度百科词条,因为百度百科词条流量大、权重高、排名靠前,创建百度百科词条可以提高企业或是个人的知名度和口碑。 百度百科词条怎么做?每天都有用户在百度上搜索这…

携手亚马逊云科技,大地量子高精度功率预测系统助力清洁能源消纳提速增效

近年来,我国光伏和风电并网装机容量持续增长,截至2021年底,全国可再生能源装机规模突破10亿千瓦,占总发电装机容量的44.8%。其中,风电装机3.28亿千瓦、光伏发电装机3.06亿千瓦。风光电总装机和新增装机规模多年来位居全…

图解 script 标签中的 async 和 defer 属性

图解 script 标签中的 async 和 defer 属性 我们在工作中经常会碰到 script 标签,一般会有以下三种形式 <script srcxxx></script> <script srcxxx async></script> <script srcxxx defer></script>那么这三种形式的 script 标签有什么区…

java 多线程

1.什么是进程&#xff1f;什么是线程&#xff1f; 进程是:一个应用程序&#xff08;1个进程是一个软件&#xff09;。 线程是&#xff1a;一个进程中的执行场景/执行单元。 注意&#xff1a;一个进程可以启动多个线程。 我们在启动java程序的时候&#xff0c;会先启动JVM&am…

【2】MYSQL数据的导入与导出

文章目录 MYSQL-库(相同库名称)的导入导出MYSQL-库(不同库名称)的导入导出MYSQL-表的导入导出MYSQL-表的指定查询记录导入导出前提: 客户端工具是:SQLyog MYSQL-库(相同库名称)的导入导出 1、选中指定库——右键,选择【将数据库复制到不同的主机/数据库】 2、选中指…

分布式之Raft共识算法分析

写在前面 在分布式之Paxos共识算法分析 一文中我们分析了paxos算法&#xff0c;知道了其包括basic paxos和multi paxos&#xff0c;并了解了multi paxos只是一种分布式共识算法的思想&#xff0c;而非具体算法&#xff0c;但可根据其设计具体的算法&#xff0c;本文就一起来看…

SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤 在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中&#xff0c;描绘了MOT问题的四个主要步骤 1.跟定视频原始帧 2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测&#xff0c;获取目标…

vue 3.0 Vue Router导航守卫的使用

目录前言&#xff1a;安装路由快速使用1. 创建路由模块2.规定路由模式3.使用路由规则4.声明路由链接和占位符5.重定向路由6.嵌套路由7.路径参数8. 声明式和编程式导航8.1 导航到不同的位置8.2 替换当前位置8.3 路由历史9.导航守卫9.1 全局前置守卫9.2全局路由守卫的语法参数9.3…

初阶C语言——操作符【详解】

文章目录1.算术操作符2.移位操作符2.1 左移操作符2.2 右移操作符3.位操作符按位与按位或按位异或4.赋值操作符复合赋值符5.单目操作符5.1单目操作符介绍6.关系操作符7.逻辑操作符8.条件操作符9.逗号表达式10.下标引用、函数调用和结构成员11表达式求值11.1 隐式类型转换11.2算术…

关于Java的深拷贝和浅拷贝

文章目录1.拷贝的引入1.1引用拷贝1.2对象拷贝2.深拷贝与浅拷贝2.1浅拷贝2.2深拷贝1.拷贝的引入 1.1引用拷贝 创建一个指向对象的引用变量的拷贝 Teacher teacher new Teacher("Taylor",26); Teacher otherteacher teacher; System.out.println(teacher); System…

vim常用命令

vim常用三种模式 命令模式&#xff08;Command mode&#xff09; 插入模式&#xff08;Insert mode&#xff09; 末行模式&#xff08;Last line mode&#xff09; &#xff08;一&#xff09;进入命令模式 vi 或者 vim&#xff08;二&#xff09;命令模式 -> 插入模式 &…

服务器部署流程与经验记录

服务器部署流程1.项目部署1.1 重置实例密码1.2 配置安全组规则1.3 远程连接服务器1.4 安装所需软件1.5 安装Tomcat1.6 配置宝塔安全组1.7 导入数据库和项目2. 域名注册3. 网站备案1.项目部署 1.1 重置实例密码 1.2 配置安全组规则 1.3 远程连接服务器 使用VNC远程连接&#…

实用调试技巧——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是实用调试技巧&#xff0c;其实小雅兰一开始&#xff0c;也不知道调试到底是什么&#xff0c;一遇到问题&#xff0c;首先就是观察程序&#xff0c;改改这里改改那里&#xff0c;最后导致bug越修越多&#xff0c;或者是问别…

51单片机——定时器中断实验,小白讲解,相互学习

定时器介绍 1&#xff0c;CPU时序的有关知识 震荡周期&#xff1a;为单片机提供定时信号的震荡源的周期&#xff08;晶振周期或外加震荡周期&#xff09;。状态周期&#xff1a;2个震荡周期为1个状态周期&#xff0c;用S表示。震荡周期又称S周期或时钟周期。机器周期&#xff…

Java-多线程并发-线程的实现、调度和状态转换

线程的实现 线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和执行调度分开&#xff0c;各个线程既可以共享进程资源( 内存地址、文件I/O等 )&#xff0c;又可以独立调度( 线程是CPU调度的基本单位 )。 Java语言则提供了在不…

300行代码手写spring初体验v1.0版本

70%猜想30%验证 spring&#xff1a;IOC 、DI、AOP、MVC MVC作为入口 web.xml 内部依赖一个DispathcheServlet这样一个接口 先来说一下springMVC的一些基础知识 整体的一个思路&#xff1a; 在web.xml里面进行了一个核心servlet的一个配置 核心就是这个DispatcherServlet …

用列表y表示序列x中每个元素是否被选中 根据列表y返回序列x中被选中的元素 itertools.compress(x,y)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 用列表y表示序列x中每个元素是否被选中 根据列表y返回序列x中被选中的元素 itertools.compress(x,y) [太阳]选择题 以下关于python代码表述错误的一项是? from itertools import compress …