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

【Java Web】用Redis优化登陆模块

  • 使用Redis存储验证码
    • 验证码需要频繁访问和封信,对性能要求高;
    • 验证码不需要永久保存,通常在很短时间内失效;
    • 分布式部署,存在Session共享问题;
  • 使用Redis存储登陆凭证
    • 处理每次请求时,都要查询用户登陆凭证,访问频率非常高;
  • 使用Redis缓存用户信息
    • 处理每次请求时,都要根据凭证查询用户信息,访问频率非常高。
      • 查询缓存中是否有user;
      • 如果没有就初始化缓存;
      • 如果user的信息更新,将清除缓存;

1. 使用Redis存储验证码

  • 在生成验证码的逻辑中,owner由UUID生成,并交给Cookie;然后将验证码text存到kaptcha:owner键中,并设置有效时间为60秒
@RequestMapping(path="/kaptcha", method = RequestMethod.GET)public void getKaptcha(HttpServletResponse response, HttpSession session){// 生成验证码String text = kaptchaProducer.createText();BufferedImage image = kaptchaProducer.createImage(text);// 将验证码存入session// session.setAttribute("kaptcha", text);// 优化:存到redis里// 验证码的归属ownerString kaptchaOwner = CommunityUtil.generateUUID();Cookie cookie = new Cookie("kaptchaOwner",kaptchaOwner);cookie.setMaxAge(60);cookie.setPath(context_path);response.addCookie(cookie);String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner);redisTemplate.opsForValue().set(redisKey, text, 60, TimeUnit.SECONDS);// 将图片输出给浏览器response.setContentType("image/png");try{OutputStream os = response.getOutputStream();ImageIO.write(image, "png", os);} catch (IOException e) {logger.error("响应验证码失败:"+e.getMessage());}}
  • 在登陆功能中,键从cookie中去哪出,然后从redis中获取kaptcha:kaptchaOwner键对应的值(验证码),判断验证码是否正确;
@RequestMapping(path = "/login", method = RequestMethod.POST)public String login(String username, String password, String code, boolean rememberme,Model model, HttpSession session, HttpServletResponse response, @CookieValue("kaptchaOwner") String kaptchaOwner){// 从Session中取并检查验证码 --> 优化:从Redis中取// String kaptcha = (String) session.getAttribute("kaptcha");String kaptcha = null;if(StringUtils.isNotBlank(kaptchaOwner)){String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner);kaptcha = (String) redisTemplate.opsForValue().get(redisKey);}if(StringUtils.isBlank(kaptcha) || StringUtils.isBlank(code) || !kaptcha.equals(code)){model.addAttribute("codeMsg","验证码不正确");return "/site/login";}........................

2. 使用Redis存储登陆凭证

各个逻辑验证通过后,将生成一个用户凭证(UUID生成),存到Redis中,并设置生存周期。在后续需要验证登陆逻辑时,从Redis中get即可。

 public Map<String,Object> login(String username, String password, int expiredSeconds){Map<String,Object> map = new HashMap<>();// 空值判断........// 账号密码都不为空,验证合法性// 验证账号合法性..........// 验证密码........// 生成登陆凭证LoginTicket loginTicket = new LoginTicket();loginTicket.setUserId(user.getId());loginTicket.setTicket(CommunityUtil.generateUUID());loginTicket.setStatus(0);loginTicket.setExpired(new Date(System.currentTimeMillis() + 1000 * 60 * 10));loginTicketMapper.insertLoginTicket(loginTicket);String redisKey = RedisKeyUtil.getTicketKey(loginTicket.getTicket());redisTemplate.opsForValue().set(redisKey,loginTicket);map.put("ticket", loginTicket.getTicket());return map;}

3. 使用Redis缓存用户信息

// 1. 优先从缓存中取值public User getCache(int userId){String redisKey = RedisKeyUtil.getUserKey(userId);return (User) redisTemplate.opsForValue().get(redisKey);}// 2. 如果取不到就初始化缓存public User initCache(int userId){User user = userMapper.selectById(userId);String redisKey = RedisKeyUtil.getUserKey(userId);redisTemplate.opsForValue().set(redisKey, user, 3600, TimeUnit.SECONDS);return user;}// 3. 数据变更时清除缓存数据public void clearCache(int userId){String redisKey = RedisKeyUtil.getUserKey(userId);redisTemplate.delete(redisKey);}
  • 当获取user的时候,例如根据userId获取用户信息,先判断缓存中查有没有user:userId这个键。如果有,就从缓存中返回User;如果没有,就初始化缓存,将User信息写入user:userId。
  • 每次用户信息修改后,例如更改密码后、退出登录修改ticket后、修改用户激活状态后等,多需要做一次clearCache。

相关文章:

【Java Web】用Redis优化登陆模块

使用Redis存储验证码 验证码需要频繁访问和封信&#xff0c;对性能要求高&#xff1b;验证码不需要永久保存&#xff0c;通常在很短时间内失效&#xff1b;分布式部署&#xff0c;存在Session共享问题&#xff1b; 使用Redis存储登陆凭证 处理每次请求时&#xff0c;都要查询用…...

华为云云耀云服务器L实例评测|docker私有仓库部署手册

【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本号 文档编写 文档审核 创建日期 修改日期 1.0 jzg jzg 2023.9.13 一. 部署规划与架构 1. 规划&#xff1a;&#xff08;集群&#xff1a;网络规划&…...

JAVA-3DES对称加解密工具(不依赖第三方库)

import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class EncryptUtil {// 密钥public static final String ENCR…...

基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)

本文介绍了如何使用Matlab实现惯性测量单元&#xff08;IMU&#xff09;和全球定位系统&#xff08;GPS&#xff09;组合导航数据融合的卡尔曼滤波算法。通过将IMU和GPS的测量数据进行融合&#xff0c;可以提高导航系统的精度和鲁棒性。我们将详细介绍卡尔曼滤波的原理和实现步…...

net自动排课系统完整源码(适合智慧校园)

目录 1 net自动排课系统完整源码(适合智慧校园) 1.1 后台管理admin 1.1.1 菜单 1.1.2 教学计划 net自动排课系统完整源码(适合智慧校园) 后台管理admin<%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&...

Matlab匿名函数教程

Matlab匿名函数是一种方便、简洁的函数定义方式&#xff0c;可以在不使用函数文件的情况下&#xff0c;直接在命令行或脚本中定义函数。本文将介绍Matlab匿名函数的基本语法和用法。 匿名函数的基本语法如下&#xff1a; function_handle (input_variables) expression其中&…...

【Vue】一文让你进入Vue的大门

Vue简介 官网 ● 英文官网 ● 中文官网 介绍与描述 Vue历史 Vue 是一套用来动态构建用户界面的渐进式JS框架 构建用户界面&#xff1a;把数据通过某种办法变成用户界面 渐进式&#xff1a;Vue可以自底向上逐层的应用&#xff0c;简单应用只需要一个轻量小巧的核心库&#xff0c…...

Linux mmap读/写触发共享文件页生命周期

概述 Linux的mm内存子系统的核心功能就要要管理各种类型的page,确保能高效分配和释放,让物理内存得以最大化使用。初识内存系统往往关注的是page的申请和管理流程,容易忽略page的释放回收流程,其实理解mm中的内存回收和释放也是最核心的机制。 Linux内核为了支持各种场景…...

linux 用户、组操作

一、创建用户并设置密码 #创建用户 duoergun useradd duoergun #设置用户 duoergun 密码 passwd duoergun二、创建组 #创建组 qingdynasty groupadd qingdynasty三、用户添加到组&#xff0c;用户从组删除 #添加用户duoergun到组qingdynasty usermod -aG qingdynasty duoer…...

MySQL报错this is incompatible withsal mode=only full group by处理办法

问题说明 报这个错误是指&#xff0c;在查询分组时展示了非分组字段。举例&#xff1a; select id , user_name from user group by user_name;上述语句查询id和user_name字段&#xff0c;其中user_name进行了分组&#xff0c;id并没有分组&#xff0c;这时候mysql就会报上述…...

Mybatis 动态语言 - mybatis-freemarker

前面我们介绍了Mybatis动态SQL的使用&#xff1b;本篇我们介绍使用mybatis- freemarker动态语言生成动态SQL。 如果您对Mybatis动态SQL不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 动态SQL – 使用if,where标签动态生成条件语…...

软件源码开发,网络中的“摄像头”:运维监控系统

在日常生活中&#xff0c;我们不管是在大街小巷&#xff0c;还是在商场大厦都可以见到一个圆形或是方形带有镜片的“小盒子”&#xff0c;这个“小盒子”就是摄像头&#xff0c;摄像头作为一个能实时录制记录它能照到范围内的视频图像的工具&#xff0c;可以在丢失物品、抓捕坏…...

ping命令

打开运行窗口 首先&#xff0c;我们需要打开运行窗口&#xff0c;可以通过按下WinR组合键打开。然后&#xff0c;在窗口中输入cmd&#xff0c;进入dos命令。 在命令行中输入ping命令 在dos命令行中&#xff0c;我们可以通过输入ping命令来检测网络连接。例如&#xff0c;我们…...

MFC:程序的托盘显示

介绍 关键技术&#xff0c;API函数Shell_NotifyIcon&#xff0c;具体查看msdn吧 实现的主要代码 #define MY_TRAY_ICON_ID (1)/ //其他代码&#xff1a;略BEGIN_MESSAGE_MAP(CTestShowTrayDlg, CDialogEx)//...ON_MESSAGE(WM_MY_TRAY_ICON, &CTestShowTrayDlg::OnMessag…...

AI绘画:StableDiffusion实操教程-斗破苍穹-云韵-婚服(附高清图下载)

大家好&#xff0c;我是小梦&#xff0c;最近一直研究AI绘画。 不久前&#xff0c;我与大家分享了StableDiffusion的全面教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 然而&#xff0c;仍有些读者提出&#xff0c;虽然他们已经…...

JS装饰器的介绍

装饰器的基本介绍 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上。 装饰器使用expression这种形式&#xff0c;expression求值后必须为一个函数&#xff0c;它会在运行时被调用&#xff0c;被装饰的…...

微信小程序(原生)使用Swiper实现(商品详情)视频和图片轮播(仿京东/淘宝商品详情头部视频+图片轮播)

一、需求 1、如果第一是视频&#xff0c;不进行自动轮播 2、可以手动滑动切换 3、点击播放视频&#xff0c;也可以手动滑动切换 4、视频播放完后&#xff0c;自动轮播 5、视频可以点击暂停和全屏播放二、最终效果 三、源码 播放icon使用了TDesign组件库 1、wxml <swiper c…...

关于for in 循环会遍历原型链上的属性的问题

关于for in 循环会遍历原型链上的属性的问题 for in可遍历原型链上扩展的属性&#xff0c;Object.keys() 只遍历自身属性 1.使用 for in 循环遍历对象的属性时&#xff0c;原型链上的所有属性都将被访问&#xff1a; Object.prototype.say"cgl"; // 修改Object.p…...

冠达管理:人民币升值板块个股?

人民币增值是当前热门的论题之一。面对这一趋势&#xff0c;许多投资者开端重视人民币增值板块个股的投资时机。可是&#xff0c;终究哪些职业和个股能够从人民币增值中获益&#xff1f;下面从多个视点分析这个问题。 一、出口相关职业 跟着人民币增值&#xff0c;我国的出口企…...

27.EI文章复现《高比例清洁能源接入下计及需求响应的配电网重构》

下载地址&#xff1a;高比例清洁能源接入下计及需求响应的配电网重构 1主要内容 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》&#xff0c;以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标&#xff0c;针对配电网重构模型的非凸性&…...

mysql的索引结构

索引概述 索引&#xff08; index &#xff09;是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就可以在这些…...

SMT生产中基板的机械清洁处理法有哪些

在S MT贴片加工 过程中&#xff0c;锡育和助焊剂会产生残留物质&#xff0c;残留物中包含有有机酸和可分解的电离子&#xff0c;某中有机酸狊 有腐蚀作用&#xff0c;电高子难留在焊盘还会引(起短路&#xff0c;而且这些残留物在PCBA板上是非常脏的&#xff0c;而旦不符合顾客…...

微服务面试题

一、什么是微服务 二、微服务之间是如何通讯的&#xff1f; 2.1、同步 优点&#xff1a;实时性 缺点&#xff1a;降低了可用性&#xff0c;因为客户端和服务端在请求过程中必须都是可用的 2.1.1、REST 优点&#xff1a;开发成本低&#xff0c;适应异构语言 2.1.2、RPC …...

LeetCode 1132.申请的报告2

数据准备 Create table If Not Exists Actions (user_id int, post_id int, action_date date, action ENUM(view, like, reaction, comment, report, share), extra varchar(10)); create table if not exists Removals (post_id int, remove_date date); Truncate table Act…...

室内探索无人机,解决复杂环境下的任务挑战!

前言 室内探索无人机是一种专为在室内环境中进行任务的无人机系统。相比传统的人员部署&#xff0c;室内探索无人机具有更高的灵活性和机动性&#xff0c;能够在复杂的室内环境中执行任务&#xff0c;用于未知环境的探索和特定目标的搜索。 为完成无人机室内搜索与识别等复杂…...

操作指南 | 如何参与Moonbeam投票委托

投票委托允许没有时间或者专业度一般的用户能够在治理中拥有话语权。该功能加强了决策流程&#xff0c;并且确保更大范围地代表社区利益。 通过Moonbeam委托平台&#xff0c;你需要 $GLMR 和一个相兼容的钱包。此教程使用MetaMask示范。 如何参与投票委托 前往http://delega…...

xxl-job中多节点分片的时候如何在linux服务器开启多个执行器实例?

在 xxl-job 中&#xff0c;可以通过在 Linux 服务器上启动多个执行器实例来实现分布式的分片任务处理。以下是在 Linux 服务器上开启多个执行器实例的步骤&#xff1a; 1.复制并配置多个执行器项目模块&#xff1a; 复制原始的执行器项目模块&#xff0c;并重命名为不同的名称…...

springboot三种注入方式

在Spring Boot中&#xff0c;您可以使用三种主要的方式来进行依赖注入&#xff1a; 构造函数注入&#xff08;Constructor Injection&#xff09;&#xff1a;您可以在类的构造函数中声明依赖项&#xff0c;然后Spring容器会在创建Bean实例时自动注入这些依赖项。这种方式通常用…...

信息化发展38

组织模型一信息系统战略 1 、信息系统战略是组织用来提供信息服务的计划。 2 、信息系统支撑组织实施其业务战略。业务战略是关于竞争&#xff08;服务对象想要什么&#xff0c; 竞争做什么&#xff09; &#xff0c; 定位&#xff08;组织想以什么方式竞争&#xff09;和能力…...

PMP含金量再升级!北京上海等地可评职称!

最近PMP证书又“升级”了&#xff0c;不过不是证书上的改变&#xff0c;而是含金量在原有基础上又上升了一个档次。 9月4日&#xff0c;北京市人力资源和社会保障局联合北京市人才工作局发布关于印发《北京市境外职业资格认可目录(3.0版)》的通知&#xff0c;PMP项目管理证书也…...

杭州网站建设商业/雅虎搜索引擎

一、简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xmlnew XmlDocument(); //导入指定xml文件 xml.Load(path); xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml")); //指定一个节点 XmlNode rootxml.SelectSingleNode("/ro…...

给公司做网站数据分析/如何创建公司网站

文件夹 1、需求 2、框架结构图和步鄹图 3、代码结构 4、代码展现 ———————————————————————- 1、需求 1.1、解析路径&#xff0c;将路径的最后一个字符串作为Appkey&#xff1b; 1.2、数据缓存。当Kafka无法正常訪问时在本地Cache文件夹缓存数据&#x…...

常州网站建设方案优化/知乎关键词优化软件

签名&#xff1a;私钥 加密 HASH值。 公钥解密 加密数据&#xff1a;公钥加密&#xff0c;私钥解密。 数字证书&#xff1a;CA 颁发者 有效期 使用者 序列号 公钥 指纹算法 指纹 注&#xff1a;CA证书服务器 身份号码 照片 CA机构签名 第一阶段&#xff1a;…...

做网站可以用中文域名备案嘛/推广资源整合平台

目录 eLCDIF接口 相关寄存器 配置步骤 LCD像素时钟的设置 eLCDIF接口 LCDIF是I.MX6U自带的液晶屏幕接口,用于连接RGB LCD接口的屏幕,eLCDIF接口特性如下: 1.支持RGB LCD的DE模式。 2.支持VSYNC模式以实现高速数据传输。 3.支持ITU-R BT.656格式的4:2:2的YCbCr 数字视频…...

网站视觉优化怎么做/google官网入口

55. 跳跃游戏 原题链接 题目&#xff1a; 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步&…...

免费注册网站怎么做链接/网站免费下载安装

很多场景中&#xff0c;您或许需要用到图片&#xff1b;如写文章、做设计、搞 PPT、发朋友圈诸此等等&#xff1b;之前有发布文章欲问美图何处寻&#xff1f;倾城之链有定音[1]&#xff0c;介绍了大量高质量、免费美图网站&#xff1b;而本篇文章&#xff0c;将会对图片工具网站…...