基于session注册JAva篇springboot

springboot3全家桶,数据库 :redis,mysql

背景环境:邮箱验证码,验证注册 

流程:先通过邮箱验证,发送验证码,将获取到的session和验证码,存入redis里(发送邮箱)

在pop添加
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

@Resource

StringRedisTemplate template;有了上面的框架就可以直接调用

server服务层

发送邮件impl实现层代码

    @Overridepublic String sendValidateEmail(String email, String session) {//数据搬运工,将key搬运来String key = "email:" + session + ":" + email;//处理数据,深加工,if (Boolean.TRUE.equals(template.hasKey(key))) {Long expire = Optional.ofNullable(template.getExpire(key, TimeUnit.SECONDS)).orElse(0L);if (expire > 120)return "请稍后再试!";}Random random = new Random();int code = random.nextInt(899999) + 10000;SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setFrom("yanxin_ru@163.com");simpleMailMessage.setTo(email);simpleMailMessage.setSubject("您的安全验证邮件");simpleMailMessage.setText("验证码:" + code);try {mailSender.send(simpleMailMessage);template.opsForValue().set(key, String.valueOf(code), 3, TimeUnit.MINUTES);return "发送成功";} catch (MailException e) {e.printStackTrace();return "发送失败";}}

注册实现

  @Overridepublic String addValidateUser(String username, String password, String email, String code, String session) {String key = "email:" + session + ":" + email;if (Boolean.TRUE.equals(template.hasKey(key))) {int i = mapping.userByAdmitOREmail(email).getId();if (i >= 3){return "邮箱注册上限!(3)";}String s = template.opsForValue().get(key);if (s == null) return "验证码失效,请重新获得验证码";if (Objects.equals(s, code)) {String encode = new BCryptPasswordEncoder().encode(password);if (mapping.addUser(username, encode, email) > 0) {return null;} else {return "系统问题,请联系管理员";}} else {return "验证码错误,请重新输入验证码";}} else return "请先获取验证码,感谢配合!";}

每次成功发送邮箱,就会运行这条

template.opsForValue().set(key, String.valueOf(code), 3, TimeUnit.MINUTES);

在redis存储一条key+email+session

注册功能会失败的情况下目前所知道的有三种!!!

在说问题前,最重要的是这条代码Boolean.TRUE.equals(template.hasKey(key))

如果我们邮箱发送成功了,那么redis里是能查到数据的

看两这个是一样的,理论情况

第一情况

当我们的session不同时,那么这个代码一直就返回这条请先获取验证码,感谢配合!

为什么会造成这个?

因为:前端发送的session和我们存储的session不同导致的,两者客户端不同所导致的!

啊!我前端后端在一起为什么会出现这个问题!

很简单,127.0.0.1本地连接,localhost本地连接,按道理这两个是一样的啊!

错错,大错特错,这两个是不一样的!,别问,问就是不知道,具体的细节是不知道的,但是知道的localhost在使用时会转换成127.0.0.1,这就是核心,他会转换成127.0.0.1,这个可奇妙了!

所以前端使用127.0.0.1,那么后端也要127.0.0.1,两者保持一致,就可以解决前端发送的session和我们存储在rdis的session不同

同理,后端使用localhost那么前端也用

第二情况

Objects.equals(s, code)判断问题,字符串判断要用equals

第三情况

mapping.addUser(username, encode, email) > 0

我们使用了spring surety,如果传进数据库的不是加密的密码,这个会导致后续登录出现问题

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

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

相关文章

社区店运营方案分享:从推广到盈利的实战经验

对于想要开实体店或创业的朋友们&#xff0c;社区店是一个具有很大发展潜力的选择。 作为一名鲜奶吧5年的创业者&#xff0c;我将分享一些从推广到盈利的实战经验&#xff0c;希望能给大家提供有价值的参考。 1、市场调研&#xff1a; 在开店之前&#xff0c;深入了解社区的…

python 基础知识点(蓝桥杯python科目个人复习计划59)

今日复习内容&#xff1a;做题 例题1&#xff1a;建造房屋 问题描述&#xff1a; 小蓝和小桥是两位年轻的建筑师&#xff0c;他们正在设计一座新的城市。 在这个城市中&#xff0c;有N条街道&#xff0c;每条街道上有M个位置可以建造房屋&#xff08;一个位置只能建造一个房…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

线性代数笔记13--正交向量和正交子空间

0. 四个子空间 1. 正交向量 两向量点乘为0&#xff0c;向量正交。 A ⊤ B 0 A^{\top}B0 A⊤B0 勾股定理 ∣ ∣ x ∣ ∣ 2 ∣ ∣ y 2 ∣ ∣ ∣ ∣ x y ∣ ∣ 2 ||x||^2||y^2||||xy||^2 ∣∣x∣∣2∣∣y2∣∣∣∣xy∣∣2 验证正交条件 ∣ ∣ x ∣ ∣ 2 x ⊤ x x x ⊤ ∣…

Qt ini配置文件

ini文件用于保存用户的设置操作&#xff0c;下列以背景颜色设置为例子 暂时默认设置为白色背景 这段代码放置在主窗口的构造函数中&#xff0c;用于初始化读取ini文件 QString color;QSettings *set new QSettings("color.ini",QSettings::IniFormat);set->begi…

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习:创建并调用函数-字符集合的并集-上机代码

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习&#xff1a;创建并调用函数-字符集合的并集-上机代码 本文环境&#xff1a; win10 Thonny4.1.4 # 函数训练字符集合的并集 def my_union(str1,str2):list1 []list2 []i 0 while i < len(str1):lis…

OpenAI官方发文:对于马斯克起诉Opanai的看法

双方立场 马斯克的观点&#xff1a;投入资金将OpenAi并入特斯拉&#xff0c;实现从非盈利组织到盈利组织的转变。 OpenAi的观点&#xff1a;OpenAI 的使命是确保 AGI 惠及全人类&#xff0c;需要筹集资金搞研发&#xff0c;以非盈利组织模式运营&#xff0c;不急于实现盈利。盈…

钉钉群内自定义机器人发送消息功能实现

文章目录 钉钉群内自定义机器人发送消息功能实现1、设置webhook自定义机器人2、查看官方文档&#xff0c;使用open api3、编写业务代码4、发送成功结果如下 钉钉群内自定义机器人发送消息功能实现 1、设置webhook自定义机器人 设置关键词 添加完成后&#xff0c;获得改机器人的…

为什么 JavaScript 中的 0.1 + 0.2 不等于 0.3

本文作者为 360 奇舞团前端开发工程师 在使用 JavaScript 处理运算时&#xff0c;有时会碰到数字运算结果不符合预期的情况&#xff0c;比如经典的 0.1 0.2 不等于 0.3。当然这种问题不只存在于 JavaScript&#xff0c;不过编程语言的一些原理大致相通&#xff0c;我以 JavaSc…

Matter 笔记1-环境准备,编译

不要远程登录Ubuntu输入以下命令&#xff0c;原因&#xff1a;ubuntu/linux上的http代理设置 1. 准备 1.1 工具 Ubuntu 22.04 LTSClash 里General的端口设置到ubuntu 的网络设置里 1.2 代码 这里使用芯科整理过的代码 git clone https://github.com/SiliconLabs/matter.…

Linux:kubernetes(k8s)探针ReadinessProbe的使用(9)

本章yaml文件是根据之前文章迭代修改过来的 先将之前的pod删除&#xff0c;然后使用下面这个yaml进行生成pod apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标…

Requests教程-15-文件上传与下载

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节&#xff0c;我们学习了requests的HTTPS请求方法&#xff0c;本小节我们讲解一下在requests文件上传与下载。 文件上传 使用requests库上传文件时&#xff0c;需要使用files参数&#xff0c;并将文件打…