基于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.mzph.cn/news/712825.shtml

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

相关文章

【leetcode】链表的回文结构

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 1.找中间节点 找中间节点的方法在下面这个博文中详细提过 【点击进入&#xff1a;【l…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:布局约束)

通过组件的宽高比和显示优先级约束组件显示效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 aspectRatio aspectRatio(value: number) 指定当前组件的宽高比。 卡片能力&#xff1a; 从API vers…

springboot /tmp 临时目录

文章目录 1.生成机制2.产生异常3.解决办法3.1 重启大法3.1 从Linux层面修改 /tmp目录的清理策略3.2 增加JVM配置3.3 增加JVM配置3.4 添加spring boot配置3.5 使用配置类配置 1.生成机制 在linux系统中&#xff0c;springboot应用服务再启动&#xff08;java -jar 命令启动服务…

浅谈 Linux 孤儿进程和僵尸进程

文章目录 前言孤儿进程僵尸进程 前言 本文介绍 Linux 中的 孤儿进程 和 僵尸进程。 孤儿进程 在 Linux 中&#xff0c;就是父进程已经结束了&#xff0c;但是子进程还在运行&#xff0c;这个子进程就被称作 孤儿进程。 需要注意两点&#xff1a; 孤儿进程最终会进入孤儿院…

一篇Sora模型小白扫盲文——《Sora技术报告》总结

Sora技术报告的核心总结 根据目前公开的一些信息,我个人将Sora技术报告一文中的核心内容总结如下,分别为训练过程的开创性优化技术、模型支持的能力、模型的缺陷。 一、训练过程开创性优化技术 1.ChatGPT的分词(token)处理取得了很好的一致性文本处理能力,Sora也借鉴了这…

勒索病毒普通用户防范建议

勒索病毒普通用户防范建议 定期备份存储在计算机上的数据&#xff0c;这样勒索软件感染不会永远破坏您的个人数据。 最好创建两个备份副本&#xff1a;一个存储在云中&#xff08;记住使用一个自动备份文件的服务&#xff09;&#xff0c;另一个物理存储&#xff08;便携式硬…

软考-计算题

1.二维矩阵转换成一维矩阵 2.算术表达式&#xff1a; 3.计算完成项目的最少时间&#xff1a;之前和的max&#xff08;必须之前的所有环节都完成&#xff09; 松弛时间&#xff1a;最晚开始时间-最早开始时间 最早&#xff1a;之前环节都完成的和的max 最晚&#xff1a;总时间…

基于区块链技术的物联网设备影子服务

一&#xff0e; 背景 物联网设备影子是指真实的物联网设备在物联网平台中对应的虚拟设备&#xff0c;设备影子服务存储了对应物理设备的当前数据。用户使用物联网设备的实时数据都是从物联网设备影子服务获取&#xff0c;如果设备影子服务的数据被修改&#xff0c;就容易导致…

黑猫的牌面

解法&#xff1a; 桶 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);vector<int> tong(1001);int t 4;int k, pai;long lon…

LeetCode 每日一题 树合集 Day 16 - 27

终于是开学了&#xff0c;想了想每日一更频率太高&#xff0c;以后每周更新一周的每日一题。 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c…

探索网络通信与序列化:打造现代Web应用的基石20240227

在构建现代Web应用的过程中&#xff0c;理解网络通信协议与数据序列化技术的基本概念至关重要。这些技术不仅是网络世界的基础设施&#xff0c;而且也是开发者设计和实现高效、可靠应用的关键工具。本文旨在深入浅出地介绍这些概念&#xff0c;帮助开发者更好地掌握构建Web应用…

嵌入式开发——面试题操作系统(调度算法)

linux7种进程调度算法 1&#xff1a;先来先服务&#xff08;FCFS&#xff09;调度算法 原理&#xff1a;按照进程进入就绪队列的先后次序进行选择。对于进程调度来说&#xff0c;一旦一个进程得到处理机会&#xff0c;它就一直运行下去&#xff0c;直到该进程完成任务或者因等…

阿里云降价,这泼天的富贵你接不接?附云服务器价格表

阿里云能处&#xff0c;关键时刻ta真降价啊&#xff01;2024新年伊始阿里云带头降价了&#xff0c;不只是云服务器&#xff0c;云数据库和存储产品都降价&#xff0c;阿里云新老用户均可购买99元服务器、199元服务器&#xff0c;续费不涨价&#xff0c;阿里云百科aliyunbaike.c…

智能指针(Smart Pointers)

定义 智能指针&#xff08;Smart Pointers&#xff09;是C中的一种高级特性&#xff0c;它提供了一种自动管理动态分配内存的机制。通过智能指针&#xff0c;开发者可以避免手动管理内存所带来的问题&#xff0c;如内存泄漏和悬挂指针等。智能指针的主要目的是确保当对象不再需…

【力扣hot100】刷题笔记Day17

前言 今天竟然不用开组会&#xff01;天大的好消息&#xff0c;安心刷题了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

C++学习第四天(类与对象下)

1、构造函数的其他知识 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值 构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化&#xff0c;构造函…

Nginx+keepalived 高可用高性能

什么是高可用: 在使用 Nginx 做反向代理或者负载均衡的时候,都是以 Nginx 为入口,如果 Nginx 宕机了,那么所有的服务都无法正常提供,影响非常严重。所有我们需要保证 nginx 高可用,就是配置备份机,前一个挂了,还有后一个。 为了避免负载均衡服务器宕机造成严重影响,…

关于游戏报错提示x3daudio1_7.dll丢失怎么修复?多个实测有效方法分享

x3daudio1_7.dll 是一个与 Microsoft DirectX 相关的重要动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它主要服务于Windows操作系统下的多媒体和游戏应用程序。 一、以下是关于 x3daudio1_7.dll 文件的详细介绍 名称与位置&#xff1a; 文件名&#xff1a;x3daud…

PHP堆栈+errLog定位

调用堆栈&#xff08;Call Stack&#xff09;是一个记录了程序在运行时所有活动子例程的栈结构。它以函数调用的方式描述了程序的执行流程和调用关系。 在PHP中&#xff0c;我们可以通过打印PHP调用堆栈来辅助调试和定位代码中的问题。本文将介绍如何在PHP中打印调用堆栈&…

探秘Python的Pipeline魔法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Pipeline&#xff1f; Pipeline的基本用法 Pipeline的高级用法 1. 动态调参 2. 并行处理 3. 多输出 …