Redis速成(1)VMware虚拟机安装Redis+Session验证登录注册+MybatisPlus

  •  课程:黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目_哔哩哔哩_bilibili

Mybatis与MybatisPlus:

参考springboot,需要额外写mapper.class,在方法上+@Select等

在ssm中,需要这样实现mybatis:

配置 sql mapper映射文件

sqlsession实现与数据库连接

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession sqlSession = sessionFactory.openSession();
User user = sqlSession.selectOne("com.demo.dao.UserMapper.getUserById", 1);
sqlSession.close();

MybatisPlus:自带分页 ,更便捷的 CRUD (create,read,update,delete)操作:

MyBatis-Plus 提供了一个 BaseMapper 接口,它封装了所有常见的 CRUD 操作方法,开发者无需手动编写 SQL 语句,框架会自动根据实体类和方法名生成对应的 SQL 并执行。这就是“更便捷的 CRUD 操作”的含义。

1.Redis下载与安装

1.基于Linux系统来安装Redis,利用docker,使用redis,用linux而不是windows:redis在设计之初是没有官方windows版的

此处选择的Linux版本为CentOS 7

2.docter和linux的关系:

Docker 让 Linux 更方便:Docker 让你在Linux上运行程序变得非常简单。你可以把程序打包成一个容器,然后在任何一台Linux电脑上运行,不用担心环境配置的问题。

3.下载顺序:

linux->VMware虚拟机(linux centos7版本需和vmware一起用)->docker->redis

参考文章:

vm虚拟机下载:VMware Workstation Pro 17下载安装和虚拟机创建-CSDN博客

centos7下载:

Linux发行版Centos7系统官网下载教程,Centos7系统如何搭配VMware虚拟机使用?_centos7下载-CSDN博客

虚拟机安装Docker:点终端即可进行更新

虚拟机Linux系统安装docker_linux虚拟机安装docker-CSDN博客

虚拟机安装redis:安装目录:/home/?/

Redis安装教程(vmware虚拟机上)_vmware虚拟机怎么安装redis-CSDN博客

有点问题没解决:?????????????????

安装时遇到的问题

1.无法创建新虚拟机: 无法打开配置文件 :

修改:使用管理员身份运行。

2.

修改:挂载点选择biosboot:

3.挂起后重新启动:

修改:以管理员身份运行该程序 

参考文章:

VMware开启虚拟机问题:开启此虚拟机需要用到此文件。如果移动了此文件,请提供它的新位置。_开启此虚拟机需要用到此文件。如果移动了此文件,请提供它的新位置。-CSDN博客

其他解决方法:

Vmware虚拟机找不到.vmdk文件,不能开机_虚拟机打不开vmdk文件,并提示找不到指定的文件-CSDN博客

4..yaml配置的修改:

获取host,port:vm终端输入:

redis-cli
ping
config get port
//得到port
config get bind
//得到host

此处:

再输入:ifconfig

5.启动

后端启动:

添加spb启动模块:

成功运行:

前端启动:

启动失败:

修改:

1.重新创建nginx中的temp目录和temp/client_body_temp

2.以管理员打开cmd,启动nginx,会出现提示框“是否允许Nginx使用网络”,再次登录url,启动成功(每次启动该程序都要进行的一步)


2.基于Session的登录

BUG:手机号与验证码需一一匹配

1.保存验证码到Session?

当你在网站上看到验证码图片时,网站不仅把验证码显示给你,还会把验证码的正确答案“偷偷”保存在你的Session里。这样做的目的是:

验证你输入的是否正确: 当你输入验证码并提交表单时,网站会去Session里查看保存的正确答案,然后和你输入的内容对比。如果一致,说明你输入正确;如果不一致,说明你输入错误或者可能是机器人。

防止作弊: 如果验证码不保存在Session里,而是直接显示在网页上,那么恶意用户可能会通过技术手段直接读取验证码,从而绕过验证。保存在Session里可以让验证码更安全。

2.登录和更新密码使用Token的原因

无状态和分布式支持:Token(如JWT)是无状态的,适合分布式系统和微服务架构。每次请求携带Token,服务器通过解析Token验证用户身份,无需依赖服务器端的Session存储。

跨域支持:Token可以通过请求头传递,天然支持跨域通信,适合前后端分离的架构。

性能优势:Token机制无需在服务器端存储用户状态,减轻了服务器的内存压力,适合高并发场景。

安全性:Token可以通过签名和加密确保安全性,并且可以设置过期时间,进一步增强安全性。

3. 验证码使用Session的原因

临时性:验证码是临时数据,仅在用户提交表单时使用一次。Session适合存储这种临时且需要快速验证的数据。

安全性:Session数据存储在服务器端,客户端无法直接访问或篡改,更适合存储验证码这种敏感信息。

简单性:使用Session存储验证码的实现方式简单,不需要额外的Token生成、解析和验证逻辑。

Token适用于需要无状态、支持分布式和跨域的场景,如登录认证和API保护。

Session适用于需要临时存储且对安全性要求较高的场景,如验证码。

4.为什么 Token 需要返回凭证?

  • 无状态性:Token 是无状态的,服务器不会存储用户的会话信息。每次请求都需要通过 Token 来验证用户身份,因此 Token 本身就是一个“凭证”,客户端必须在每次请求中携带它。

  • 跨域和分布式支持:Token 通常用于前后端分离的架构或分布式系统中。由于客户端和服务器可能不在同一个域下,Token 需要作为凭证在每次请求中传递,服务器通过解析 Token 来确认用户的身份和权限。

  • 安全性:Token 包含签名,可以防止被篡改。服务器通过验证签名来确保 Token 的合法性,因此 Token 本身就是一个安全的凭证。

5.为什么 Session 不需要返回凭证?

   //保存用户信息到sessionsession.setAttribute("user",user);return Result.ok();

Session 是一种服务器端存储机制,服务器在用户登录时会创建一个 Session,并将用户的状态信息存储在服务器端。服务器会生成一个 Session ID,并将其返回给客户端(通常存储在 Cookie 中)。客户端在后续请求中携带 Session ID,服务器通过 Session ID 查找对应的 Session 来验证用户身份。

  • 服务器端存储:Session 的核心数据(如用户身份、权限等)存储在服务器端,客户端只需要携带一个 Session ID(通常是一个随机字符串)。服务器通过 Session ID 找到对应的 Session,从而验证用户身份。

  • 有状态性:Session 是有状态的,服务器会维护用户的会话状态。客户端不需要携带完整的用户信息或权限信息,只需要携带 Session ID 即可。

  • 安全性:Session ID 是由服务器生成的随机字符串,很难被预测或伪造。服务器通过 Session ID 来管理用户的会话状态,客户端不需要关心 Session 的具体内容。

  • Cookie和Session:   想象一下,你去一个餐厅吃饭,服务员给你一个小纸条,上面写了一些信息,比如你点的菜、座位号等。每次你去柜台拿东西的时候,服务员都会看看这个小纸条,然后根据上面的信息给你服务。这个小纸条就是 Cookie。服务员给你一个小纸条(Cookie),但真正记录你点的菜和座位号的地方是服务员的笔记本(Session)。这个笔记本放在厨房里,服务员通过小纸条上的编号(Session ID)来找到你在笔记本里的记录

6.图示


发送验证码

图示:POST/GET/PATCHE

@RequestParam:它可以帮助你从 HTTP 请求中提取数据,并将其传递给方法中的变量。

代码展示:

Controller:

    @PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {// TODO 发送短信验证码并保存验证码return userService.sendCode(phone,session);}

serviceImpl:

   @Overridepublic Result sendCode(String phone, HttpSession session) {//校验if(RegexUtils.isPhoneInvalid(phone)){//校验不通过return  Result.fail("手机号格式错误");}//校验通过,生成验证码String code=RandomUtil.randomNumbers(6);//验证码保存到sessionsession.setAttribute("code",code);//发送验证码log.debug("验证码:{}已发送",code);return Result.ok();}

运行:

 


登录注册

图示:请求参数见Payload

@RequestBody:前端到后台接受JSON格式数据,就用这个 

ServiceImpl类创建新方法快捷键:crtl+alt+m

代码展示: 

Controller:

   @PostMapping("/login")public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){// TODO 实现登录功能return userService.login(loginForm,session);}

ServiceImpl:

  //登录@Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//验证手机号//每一个事务进行完整的校验if(RegexUtils.isPhoneInvalid(loginForm.getPhone())){return Result.fail("手机号格式错误") ;}//验证验证码Object cachecode=session.getAttribute("code");String code=loginForm.getCode();if(cachecode==null||!cachecode.toString().equals(code)){//不一致//反向校验,避免if嵌套return Result.fail("验证码有问题");}//一致//手机号-》用户//mybatisplus select * from user where phone=#{phone};User user=query().eq("phone",loginForm.getPhone()).one();//用户是否存在if(user==null){//用户不存在,根据phone创建新用户user= CreateUserWithPhone(loginForm);}//保存用户信息到sessionsession.setAttribute("user",user);return Result.ok();}private User CreateUserWithPhone(LoginFormDTO loginForm) {User user=new User();user.setPhone(loginForm.getPhone());user.setNickName(USER_NICK_NAME_PREFIX+RandomUtil.randomString(10));save(user);return user;}

mybatisplus:

save() 方法的作用是将一个新创建的对象(在这个例子中是 User 对象)保存到数据库中。具体来说,它会执行一个 插入(INSERT) 操作,将对象的数据写入数据库表中。

运行:


检验登录

用到拦截器,参考springboot速成(八),未登录不能访问页面内容,也用到了拦截器:

定义拦截器(类上+@Configuration)>配置拦截器

Implenments HandleInterceptor 快捷键:ctrl+i

if(user==null) 快捷键:user.null+enter

LoginFormDTO有phone,code,password,UserDTO有id,nickname,icon,User有id,phone,password,nickName,icon,createTime,updaTime。为什么要创建LoginFormDTO,UserDTO:

1.创建不同的 DTO(Data Transfer Object,数据传输对象)和实体(Entity)类是为了满足不同的需求和目的。

2.LoginFormDTO

安全性:只发送必要的信息(如电话号码和密码),而不是用户的全部信息。

简化处理:在处理登录逻辑时,只需要关注 LoginFormDTO 中的字段,简化代码逻辑。

前后端分离:在前后端分离的架构中,LoginFormDTO 用于定义前端发送的数据格式。

3.UserDTO:(在此处,为了不显示额外不必要用户信息,返回UserDTO)

数据封装:封装需要传输的用户信息,而不是直接使用实体类。

灵活性:可以根据需要选择性地包含或排除某些字段,而不需要修改实体类。

解耦:将数据传输逻辑与业务逻辑分离,提高代码的可维护性和可读性。

代码展示:

创建拦截器:

package com.hmdp.utils;import com.hmdp.dto.UserDTO;import com.hmdp.entity.User;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Configuration
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取session//获取session中的用户HttpSession session=request.getSession();Object user=session.getAttribute("user");//判断用户是否存在if (user == null) {//不存在,拦截response.setStatus(401);return false;}//存在,保存UserHolder.saveUser((UserDTO) user);//放行return  true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();}
}

配置拦截器:

package com.hmdp.config;import com.hmdp.utils.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/shop/**","/shop-type/**","/upload/**","/voucher/**","/blog/hot","/user/code","/user/login");}
}

 Controller:

  @GetMapping("/me")public Result me(){// TODO 获取当前登录的用户并返回UserDTO user= UserHolder.getUser();return Result.ok(user);}

运行:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp下的Job队列处理

需要think-queue扩展,没有的请composer安装一下 "require": {"php": ">7.2.5","topthink/framework": "^6.1","topthink/think-orm": "^2.0","topthink/think-multi-app": &qu…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(五)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(五) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema?三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例:定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

VMware虚拟机Mac版安装Win10系统

介绍 Windows 10是由美国微软公司开发的应用于计算机和平板电脑的操作系统,于2015年7月29日发布正式版。系统有生物识别技术、Cortana搜索功能、平板模式、桌面应用、多桌面、开始菜单进化、任务切换器、任务栏的微调、贴靠辅助、通知中心、命令提示符窗口升级、文…

计算机网络:ICMP协议(Internet控制消息协议)介绍

目录 一、简介 二、为什么要有ICMP协议? 三、ICMP协议报文格式 四、ICMP报文的类型 4.1 差错报文 4.2 查询报文 五、ICMP报文的实际案例 5.1 Ping命令 5.2 Traceroute命令 总结 今天和大家聊聊ICMP协议相关的知识,感兴趣的可以一起了解一下! 一、简介 ICMP(Inte…

python读取sqlite温度数据,并画出折线图

需求: 在Windows下请用python画出折线图,x轴是时间,y轴是温度temperature 和体感温度feels_like_temperature 。可以选择县市近1小时,近1天,近1个月的。sqlite文件weather_data.db当前目录下,建表结构如下…

window下kafka安装

kafka下载 下载好,直接解压即可 默认是带有zookeeper(注册中心) 需要先启动zookeeper zookeeper配置 先配置下zookeeper 这个data文件夹是自定建的 随意建在哪里 注意 这里斜杠用和linux一样 启动zookeeper 进入bin/windows目录 启动zookeeper zookeeper-server-start.ba…

开发HarmonyOS NEXT版五子棋游戏实战

大家好,我是 V 哥。首先要公布一个好消息,V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1:ArkTS 语言篇》图书终于出版了,有正在学习鸿蒙的兄弟可以关注一下,写书真是磨人,耗时半年之久,感概一下…

2月26(信息差)

🌍思科和英伟达新旧双王联手 目标重塑网络架构抢占下沉市场 🎄全球AI大混战升温!超越Sora的阿里万相大模型开源 家用显卡都能跑 ✨小米15 Ultra、小米SU7 Ultra定档2月27日 雷军宣布:向超高端进发 1.全球首个!人形机器…

物联网通信应用案例之《智慧农业》

案例概述 在智慧农业方面,一般的应用场景为可以自动检测温度湿度等一系列环境情况并且可以自动做出相应的处理措施如简单的浇水和温度控制等,且数据情况可远程查看,以及用户可以实现远程控制。 基本实现原理 传感器通过串口将数据传递到Wi…

C# Unity 唐老狮 No.1 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 目录 C# 1.其他类型转object类…

网络安全扫描--基础篇

前言 1、了解互联网安全领域中日趋重要的扫描技术 2、了解在不同网络场景下扫描技术手段 3、熟悉linux下系统内核防护策略并能大件一个有效的系统防护体系 4、增强工作安全意识,并能有效的实践于工作场景中 目录 1、熟悉主机扫描工具(fping,…

P8697 [蓝桥杯 2019 国 C] 最长子序列

P8697 [蓝桥杯 2019 国 C] 最长子序列 题目 分析代码 题目 分析 先分析一波xdm 题意呢就是在s中找有多少个能和t匹配的字符,注意:连续匹配,输出连续的次数 欧克,开始分析,首先,哎~字母!还强调…

一篇docker从入门到精通

Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iP…

TCP/IP 5层协议簇:物理层

目录 1. 物理层(physical layer) 2. 网线/双绞线 1. 物理层(physical layer) 工作设备:网线、光纤、空气 传输的东西是比特bit 基本单位如下:数字信号 信号:【模拟信号(放大器&a…

生成对抗网络(GAN)

生成对抗网络(GAN):生成对抗网络是一种深度学习模型,由 Ian Goodfellow 等人在 2014 年提出。GAN由生成器和判别器组成,生成器生成假数据,判别器区分真假数据。两者通过对抗训练不断提升,最终生成器能够生成…

FastJSON 默认行为:JSON.toJSONString 忽略 null 字段

完整的 FakeRegistrationController 代码,这让我可以全面分析后端逻辑,特别是为什么空的字段(如 compareDate)不返回给前端。我将详细分析代码的每个接口,尤其是与 list 请求和字段返回相关的部分,并解释原…

网络通信/IP网络划分/子网掩码的概念和使用

文章目录 概述子网的考题子网掩码的历史有/无类地址子网划分!子网掩码超网技术/CIDR子网掩码和路由IP子网掩码定义 网络规划网络规划-拆子网网络规划-组超网子网划分案例 区分于其他特殊IP地址IP地址和网络地址子网掩码和网络地址子网掩码和广播地址 子网间的通信其他 概述 本…

中国的Cursor! 字节跳动推出Trae,开放Windows版(附资源),开发自己的网站,内置 GPT-4o 强大Al模型!

Trae是什么 Trae 是字节跳动推出的免费 AI IDE,通过 AI 技术提升开发效率。支持中文,集成了 Claude 3.5 和 GPT-4 等主流 AI 模型,完全免费使用。Trae 的主要功能包括 Builder 模式和 Chat 模式,其中 Builder 模式可帮助开发者从…

SpringBatch简单处理多表批量动态更新

项目需要处理一堆表,这些表数据量不是很大都有经纬度信息,但是这些表的数据没有流域信息,需要按经纬度信息计算所属流域信息。比较简单的项目,按DeepSeek提示思索完成开发,AI真好用。 阿里AI个人版本IDEA安装 IDEA中使…