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

【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解

文章目录

  • 一. 黑马点评Redis项目实践
    • 1.1开发环境搭建
      • 1.1.1 数据库
      • 1.1.2 Springboot项目
      • 1.1.3 前端配置
    • 1.2 基于session实现登录
      • 1.2.1 发送短信验证码
      • 1.2.2 短信验证码登录
      • 1.2.3 登录验证功能
        • 1.2.3.1 编写拦截器

一. 黑马点评Redis项目实践

1.1开发环境搭建

1.课程介绍:

image-20230310093159781

2.数据库:

image-20230310100434653

image-20230310095932455

3.项目架构:

image-20230310100014091

1.1.1 数据库

MySQL数据库,版本8.0

导入sql文件即可:

image-20230310103004197

1.1.2 Springboot项目

将项目文件放到idea目录下:

image-20230310140858024

加入SpringBoot启动器:

image-20230310140923127

启动项目:

访问目录:

http://localhost:8081/shop-type/list

结果如下,将数据库里的值取出:

image-20230310141032774

1.1.3 前端配置

image-20230310141215512

在改目录下,进入终端:输入命令:

start nginx.exe

image-20230310141559261

访问目录:

http://localhost:8080/

image-20230310141701368

1.2 基于session实现登录

image-20230310142802585

1.2.1 发送短信验证码

思路如下:

image-20230310143024480

TODO 发送短信验证码并保存验证码

return userService.sendCode(phone,session);

IUserService:

public interface IUserService extends IService<User> {Result sendCode(String phone, HttpSession session);
}

UserServiceImpl:

校验手机号:

if (RegexUtils.isPhoneInvalid(phone)){//2.如果不符合,返回错误信息return Result.fail("手机号格式错误");
}

符合,生成验证码

String code =RandomUtil.randomNumbers(6);

保存验证码到session

session.setAttribute("code",code);

因为目前在测试阶段,没有申请阿里云的短信服务,故用日志替代:

发送验证码

log.debug("发送验证码成功,验证码{{}}",code);

测试:

image-20230310212211524

查看日志:

image-20230310212224194

1.2.2 短信验证码登录

短信验证码登录思路:

image-20230310212944444

登录功能:登录参数,包含手机号、验证码;或者手机号、密码

TODO 实现登录功能:

return userService.login(loginForm,session);

login登录功能:

Result login(LoginFormDTO loginForm, HttpSession session);

UserServiceImpl:

校验手机号:

String phone = loginForm.getPhone();
if (RegexUtils.isPhoneInvalid(phone)){//2.如果不符合,返回错误信息return Result.fail("手机号格式错误");
}

效验验证码:

Object cacheCode=session.getAttribute("code");
String code = loginForm.getCode();if (cacheCode == null || !cacheCode.toString().equals(code)){//3.不一致,报错return Result.fail("验证码错误");}

一致根据手机号查询用户:

User user =query().eq("phone",phone).one();

判断用户是否存在

if (user == null){//6.不存在,创建新用户并且保存user = createWithPhone(phone);
}

保存用户信息到session中

session.setAttribute("user",user);

返回Result.ok()

return Result.ok();

createWithPhone,功能为:创建新用户

创建也会有:给一个随机的用户名:

User user = new User();
user.setPhone(phone);
user.setNickName("user_"+RandomUtil.randomNumbers(10));

保存用户:

save(user);
return user;

重新启动项目,填入手机号和验证码进行测试,测试结果如下:

填入一个错误的验证码:

image-20230310215836721

image-20230310215852564

填入正确的验证码:

image-20230310215915244

进入数据库查看:

image-20230310220025385

1.2.3 登录验证功能

思路:使用拦截器

image-20230310220335716

1.2.3.1 编写拦截器

新建立:Loginlnterceptor

1.获取session

HttpSession session = request.getSession();

2.获取session中的用户

Object user = session.getAttribute("user");

3.判断用户是否存在

if(user == null){//4.不存在,拦截,返回401代码response.setStatus(401);return false;
}

5.存在,保存用户信息到ThreadLocal

UserHolder.saveUser((User) user);

6.放行

return true;

7.移出

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();
}

编写MvcConfig:

配置过滤器:

@Override
public void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(new Loginlnterceptor()).excludePathPatterns("/shop/**","/voucher/**","/shop-type/**","/upload/**","/user/code","/blog/hot","/user/login");
}

重新启动:效果如下

image-20230311122937814

相关文章:

【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解

文章目录一. 黑马点评Redis项目实践1.1开发环境搭建1.1.1 数据库1.1.2 Springboot项目1.1.3 前端配置1.2 基于session实现登录1.2.1 发送短信验证码1.2.2 短信验证码登录1.2.3 登录验证功能1.2.3.1 编写拦截器一. 黑马点评Redis项目实践 1.1开发环境搭建 1.课程介绍&#xff…...

【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解

苦尽甘来 文章目录一、仿函数&#xff08;仿函数就是一个封装()运算符重载的类&#xff09;1.C语言的函数指针2.C的仿函数对象二、priority_queue中的仿函数1.模拟实现优先级队列1.1 优先级队列的本质&#xff08;底层容器为vector的适配器&#xff09;1.2 向下调整算法建堆1.3…...

网络安全 -- 常见的攻击方式和防守

网络安全 – 常见的攻击方式和防守 一 . 网页中出现黑链 特点: 隐藏,不易发现,字体大小是0,表面上看不出来,代码层面可以查出来,也可能极限偏移,颜色一致 表现: 多表现为非法植入链接,一般点击会跳转至其他网页 例如: 1.澳门新葡京等赌博网站,获取流量,有人甚至会充钱参与赌…...

Android中实现滑动的7种方法

Android中实现滑动的7种方法前置知识Android坐标系视图坐标系触控事件---MotionEvent获取坐标的方法实现滑动的7种方法layout方法offsetLeftAndRight()和offsetTopAndBottom()LayoutParamsscrollTo和scrollByScroller属性动画ViewDragHelper参考前置知识 Android坐标系 Andro…...

【hadoop】介绍

目录 介绍 版本 优势 大数据技术生态体系 介绍 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 解决 存储和分析计算Google在大数据方面的三篇论文GFS --->HDFS Map-Reduce --->MR BigTable --->HBaseHadoop创始人Doug Cutting版本 Hadoop 三大发行版本&a…...

【C语言】有关的经典题型内含数组及递归函数题型讲解(入门适用)

C语音经典题型1. 在屏幕上输出9*9乘法口诀表2. 求10 个整数中最大值3. 计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值&#xff0c;打印出结果4. 编写程序数一下 1到 100 的所有整数中出现多少个数字95. 能把函数处理结果的二个数据返回给主调函数6. 实现一个函数&#xff0c;…...

MyBatis操作数据库

目录 MyBatis 功能架构 学习MyBatis 第一个MyBatis查询 1、创建数据库和表 2、搭建MyBatis开发环境 2.1、在项目中添加MyBatis框架 2.2、配置数据库连接信息 2.3、配置MyBatis中xml的保存路径&#xff08;规则&#xff09; 3、添加业务代码 3.1、创建实体类 3.2、构…...

Object.keys(obj)与Object.values(obj)的用法

语法 Object.keys(obj) 参数&#xff1a;要返回其枚举自身属性的对象 返回值&#xff1a;一个表示给定对象的所有枚举属性的字符串数组 传入对象&#xff0c;返回属性名 1 var obj {a:123,b:345}; 2 console.log(Object.keys(obj)); //[a,b] 处理字符串&#xff0c;返回索…...

关于ES6新特性的总结

目录1.let & const2.解构赋值3.模板字符串4.简化对象写法5.箭头函数6.函数参数的默认值设置7.rest参数8.扩展运算符9.SymbolSymbol特点创建SymbolSymbol使用场景Symbol内置值10.迭代器11.生成器12.Promise基本使用Promise封装读取文件Promise封装ajaxPromise.prototype.the…...

13. CSS 处理

提取 Css 成单独文件CSS 文件目前被打包到 js 文件中&#xff0c;当 js 文件加载时&#xff0c;会创建一个 style 标签来生成样式,加载一个页面的时候&#xff0c;先 html -> js -> css&#xff0c;会有页面闪屏现象&#xff0c;用户体验不好。应该是单独的 Css 文件&…...

One-hot编码

One-Hot 编码&#xff0c;又称一位有效编码&#xff0c;其方法是使用N位状态寄存器来对N个状态进行编码&#xff0c;每个状态都由他独立的寄存器位&#xff0c;并且在任意时候&#xff0c;其中只有一位有效。 例如&#xff1a; 自然状态码为&#xff1a;000,001,010,011,100,1…...

Java中的深克隆与浅克隆

浅克隆&#xff1a; 实现Cloneable接口即可实现&#xff0c;浅克隆只对象内部的基础数据类型&#xff08;包括包装类&#xff09;被克隆&#xff0c;引用数据类型&#xff08;负责对象&#xff09;会被使用引用的方式传递。 简单来说&#xff0c;就是浅克隆属性如果是复杂对象…...

如何使用MyBatis框架实现对数据库的增删查改?

目录&#xff1a;1.创建MyBatis项目以及如何配置2.MyBatis操作数据库的模式3.实现增删查改注意&#xff1a;在我们操作数据库之前&#xff0c;先要保证我们已经在数据库建好了一张表。创建MyBatis项目以及如何配置我们在创建项目的时候&#xff0c;引入MyBatis相关依赖配置数据…...

结构体内存大小

000、前言 要想计算结构体内存大小&#xff0c;就会涉及到一个结构体内存对齐的问题&#xff0c;而不是对其成员进行简单的加运算 &#xff08;1&#xff09;在写本博客之前 有位同学和我讨论了一个学校的题目&#xff0c;题目如下&#xff1a; 我借这道题目问了另外一位同…...

gerrit操作和jinkens编译合入代码

gerrit 先 查看自己的push 找到后添加reviewer 填写邮箱开头就可以出来 记得1 然后send 让人review 编译不过&#xff0c;gerrit上查看 1.是不是checkstyle问题 2.编译不过&#xff0c;去jinkens查看 先retrigger重新编译 如果发现多次编译失败 则要看下console output 查…...

网络工程师面试题(面试必看)(3)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本系列将会提供网络工程师面试题,由多位专家整合出本系列面试题,包含上百家面试时的问题。面试必考率达到80%,本系列共86道题…...

第N次重装系统之Ubtntu

前言又一次换了服务器&#xff0c;由于centOS已经完成了自己的生命周期&#xff0c;接下来我会转去使用Ubtntu系统。当然&#xff0c;大部分docker命令是不会收到影响的&#xff0c;但是一部分安装过程可能就要重新学习了。其实这个系统也有自己的老牌包管理器apt&#xff0c;所…...

一个 适用 vue3 ts h5移动端 table组件

vue3-h5-table 介绍 适用于 vue3 ts 的 h5 移动端项目 table 组件 支持 左侧固定 滑动 每行点击回调 支持 指定列排序 链接 &#xff1a;https://github.com/duKD/vue3-h5-table 效果 props说明minTableHeight表格最小高度 可选 默认600rowNum表格显示几行 可选 默认 6he…...

Vue.js 生产打包上线实战

项目管理后台采用Vue.js 架构&#xff0c;开发完毕后设计到打包上传到服务器发布。 发布成功后&#xff0c;总结出主要要决绝两个主要问题&#xff1a; 1.打包前&#xff0c;环境设置 2.上传到服务器&#xff0c;直接放在Tomcat中出现跨域访问问题。 此次项目实际处理方法为…...

C语言指针的算术运算

C语言指针的算术运算 C语言中&#xff0c;指针是一种非常重要的数据类型。除了可以指向特定的内存地址外&#xff0c;指针还可以进行算术运算。指针的算术运算包括加、减、比较等操作&#xff0c;下面我们将详细介绍这些运算符的使用方法&#xff0c;并提供实际的示例。 指针…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...