基于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://xiahunao.cn/news/2821740.html

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

相关文章

js截取图片地址后面的参数和在路径中截取文件名或后缀名

文章目录 前言截取地址 &#xff1f;后面的参数在路径中截取文件名或后缀名总结 前言 在处理网页上的图片资源或者其他类型的文件资源时&#xff0c;你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景&#xff1a; 动态修改图片参数&#xff1a;如果你有一个图片U…

2024年【制冷与空调设备运行操作】考试总结及制冷与空调设备运行操作模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作考试总结参考答案及制冷与空调设备运行操作考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备运行操作操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备运行操作模…

《PyTorch深度学习实践》第八讲加载数据集

一、 1、DataSet 是抽象类&#xff0c;不能实例化对象&#xff0c;主要是用于构造我们的数据集 2、DataLoader 需要获取DataSet提供的索引[i]和len;用来帮助我们加载数据&#xff0c;比如说做shuffle(提高数据集的随机性)&#xff0c;batch_size,能拿出Mini-Batch进行训练。它…

Entry First Day 入职恩孚第一天

入职第一天&#xff0c;电脑还没配置好就去了工厂。 熟悉了一下设备&#xff0c;切了几个小玩意&#xff0c; hello world 一下。 了解了串行端口的Nodejs的库 https://github.com/serialport/node-serialport&#xff0c;以后要用这个东西和硬件通讯&#xff0c;安装&#…

【C++精简版回顾】15.继承派生

1.继承派生的区别 继承&#xff1a;子继父业&#xff0c;就是子类完全继承父类的全部内容 派生&#xff1a;子类在父类的基础上发展 2.继承方式 1.public继承为原样继承 2.protected继承会把public继承改为protect继承 3.private继承会把public&#xff0c;protected继承改为pr…

指针与malloc动态内存申请,堆和栈的差异

定义了两个函数print_stack()和print_malloc()&#xff0c;分别演示了两种不同的内存分配方式&#xff1a;栈内存和堆内存。然后在main()函数中调用这两个函数&#xff0c;并将它们返回的指针打印出来。 由于print_stack()中的数组c是在栈上分配的&#xff0c;当函数返回后&…

【论文笔记】An Effective Adversarial Attack on Person Re-Identification ...

原文标题&#xff08;文章标题处有字数限制&#xff09;&#xff1a; 《An Effective Adversarial Attack on Person Re-Identification in Video Surveillance via Dispersion Reduction》 Abstract 通过减少神经网络内部特征图的分散性攻击reid模型。 erbloo/Dispersion_r…

【论文阅读-基于VilLBERT方法的导航】Vison-Language Navigation 视觉语言导航(2)

文章目录 1. 【2023ICCV】Learning Vision-and-Language Navigation from YouTube Videos摘要和结论引言Building VLN Dataset from YouTube Videos模型框架实验 2. 【2021ICCV】Airbert: In-domain Pretraining for Vision-and-Language Navigation摘要和结论引言BnB DatasetA…

爬取某牙视频

爬取页面链接&#xff1a;游戏视频_游戏攻略_虎牙视频 爬取步骤&#xff1a;点进去一个视频播放&#xff0c;查看media看有没有视频&#xff0c;发现没有。在xhr中发现有许多ts文件&#xff0c;但这种不是很长的视频一般都有直接的播放链接&#xff0c;所以目标还是找直接的链…

逻辑漏洞(pikachu)

#水平&#xff0c;垂直越权&#xff0c;未授权访问 通过个更换某个id之类的身份标识&#xff0c;从而使A账号获取&#xff08;修改、删除&#xff09;B账号数据 使用低权限身份的账号&#xff0c;发送高权限账号才能有的请求&#xff0c;获得其高权限操作 通过删除请求中的认…

爱普生的SG2016系列高频,低相位抖动spxo样品

精工爱普生公司(TSE: 6724&#xff0c;“爱普生”)已经开始发货样品的新系列简单封装晶体振荡器(SPXO)与差分输出1。该系列包括SG2016EGN、SG2016EHN、SG2016VGN和SG2016VHN。它们在基本模式下都具有低相位抖动&#xff0c;并且采用尺寸为2.0 x 1.6 mm的小封装&#xff0c;高度…

【兔子机器人】五连杆运动学解算与VMC(virtual model control)

VMC (virtual model control&#xff0c;虚拟模型控制) 是一种直觉控制方式&#xff0c;其关键是在每个需要控制的自由度上构造恰当的虚拟构件以产生合适的虚拟力。虚拟力不是实际执行机构的作用力或力矩&#xff0c;而是通过执行机构的作用经过机构转换而成。对于一些控制问题…

云游戏:畅享3A游戏大作的全新时代

在科技飞速发展的今天&#xff0c;云游戏以其独特的魅力正深刻改变着游戏的玩法方式。无需昂贵硬件&#xff0c;突破设备限制畅玩3A大作&#xff0c;云游戏为玩家们带来了前所未有的游戏乐趣。本文将深入探讨云游戏的核心优势&#xff0c;为你呈现畅玩游戏的全新时代。 1. 无硬…

Go 互斥锁的实现原理?

Go sync包提供了两种锁类型&#xff1a;互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex&#xff0c;都属于悲观锁。 概念 Mutex是互斥锁&#xff0c;当一个 goroutine 获得了锁后&#xff0c;其他 goroutine 不能获取锁&#xff08;只能存在一个写者或读者&#xff0c;不能同时…

JVM内存回收算法

1.1 引用计数法 每个对象创建的时候&#xff0c;会分配一个引用计数器&#xff0c;当这个对象被引用的时候计数器就加1&#xff0c;当不被引用或者引用失效的时候计数器就会减1。任何时候&#xff0c;对象的引用计数器值为0就说明这个对象不被使用了&#xff0c;就认为是“垃圾…

从8.8到9.9,涨价的库迪还能守住牌局吗?

作者 | 辰纹 来源 | 洞见新研社 历经超半年的9.9元活动后&#xff0c;瑞幸不仅牢牢守稳盈利态势&#xff0c;还一举创造了新的神话——中国地区年收入首超星巴克。 根据瑞幸咖啡发布的截至12月31日的2023年第四季度及全年财报。第四季度&#xff0c;瑞幸咖啡净营收为70.6亿元…

【VTKExamples::PolyData】第四十一期 PointLocator

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例PointLocator,并解析接口vtkPointLocator,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. PointLocator …

ubuntu16.04安装Mysql8.0.25

更换数据源(阿里云) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo vi /etc/apt/sources.listdeb http://mirrors.aliyun.com/ubuntu/ xenial main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main multiverse…

第四十三天| 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

01背包问题 Leetcode 1049. 最后一块石头的重量 II 题目链接&#xff1a;1049 最后一块石头的重量 II 题干&#xff1a;有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将…

Harbor高可用(haproxy和keepalived)

Harbor高可用&#xff08;haproxy和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;haproxy和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设…