SpringBoot结合Redis将Token存入缓存中进行登录

2023-11-07

将登录的Token存储在Redis中可以带来以下好处:

  1. 提高安全性:将Token存储在Redis中,比将Token保存在本地Cookie或浏览器存储中更加安全,因为攻击者无法访问您的服务器上存储的Token。此外,由于Redis支持设置过期时间,可以通过设置Token的过期时间来自动删除旧Token,进一步提高安全性。

  2. 分布式部署:如果您的应用程序采用分布式部署架构,则在每个节点上保存Token可能不是最佳选择,因为这会增加管理和同步Token的复杂性。使用Redis作为统一的Token存储介质可以简化这个过程,并确保所有节点都可以访问相同的Token。

  3. 支持多端登录:如果您的应用程序允许用户从多个设备或浏览器登录,则必须跨设备/浏览器共享Token。将Token存储在Redis中可以轻松实现此目标,因为所有设备和浏览器都可以访问相同的Redis服务器。

  4. 高效查询:由于Redis是一个内存中的数据存储系统,因此它具有快速的读取和写入速度。与传统数据库相比,Redis的响应时间更短,可以提高整个应用程序的性能。

总之,将登录Token存储在Redis中可以提高应用程序的安全性、可伸缩性和性能,是一种非常流行的实践方式。

首先,确保你已经在项目中添加了spring-boot-starter-data-redisspring-boot-starter-security依赖。接下来,我们将分为以下几个部分完成实现:

  1. 配置Redis
  2. 实现Token生成
  3. 编写登录逻辑

1. 配置Redis

application.properties或者application.yml文件中配置Redis连接信息:

spring.redis.host=your_redis_host
spring.redis.port=your_redis_port

2. 实现Token生成

创建一个工具类JwtUtil用于生成和解析JWT token。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "your_secret_key";

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

3. 编写登录逻辑

创建一个LoginController处理登录请求。在用户登录成功后,将生成的token与用户名存入Redis。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class LoginController {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @PostMapping("/login")
    public String login(@RequestBody LoginForm form) {
        // 登录验证
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(form.getUsername(), form.getPassword()));

        User user = (User) authentication.getPrincipal();
        String token = JwtUtil.generateToken(user.getUsername());

        // 将token存入Redis
        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
        valueOperations.set("token:" + token, user.getUsername());
        redisTemplate.expire("token:" + token, 24, TimeUnit.HOURS);

        return token;
    }
}

这里的LoginForm是一个简单的登录表单类,包含用户名和密码字段:

public class LoginForm {

    private String username;
    private String password;

    // 省略getter和setter
}

现在你已经实现了将token存入Redis并生成的基本登录功能。当然,你还需要根据实际需要配置安全设置、用户信息加载等其他相关功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot结合Redis将Token存入缓存中进行登录 的相关文章

  • 如何通过两跳 SSH 隧道使用 JProfiler

    我正在尝试将 JProfiler 连接到在我将调用的服务器上运行的 JVMremote 该服务器只能从我的工作站访问 local 通过我将调用的另一台服务器middle 我的计划是将 JProfiler 连接到remote是这样的 安装 J
  • 创建名称为 bean 时出错:作用域“请求”对于当前线程无效

    我集成了SWF 2 2 1 Primefaces 2 2 1 JSF 2 Spring Security 3 Spring 3 1 0M1I和EhCache AspectJ和Castor 我在 app config xml 中为castor
  • Thymeleaf 和 Spring 的布尔条件

    我想在我的网页中添加错误标志 如何使用 Thymeleaf 检查 Spring 模型属性是 true 还是 false 布尔文字是true and false 使用th if你最终会得到如下代码 div 或者如果您决定选择th unless
  • 如何将 Cucumber 中的数据表转换为对象列表?

    原标题 Java 中的 Cucumber DataTables 中的标量是什么意思 From 参考 Java 提供了几种标量类型 这些包括原始数字 类型 加上布尔值和字符 每个标量 原始 类型都有一个关联的包装类或 参考类型 阅读javad
  • java.time.LocalDate 到 java.util.Date

    转换的最佳方式是什么java time LocalDate to java util Date Date from dateToReturn atStartOfDay ZoneId systemDefault toInstant 我一直在尝
  • 枚举内的枚举

    这不是我被卡住的问题 而是我正在寻找一种简洁的方式来编写我的代码 本质上 我正在编写一个事件驱动的应用程序 用户触发事件 事件被发送到适当的对象 然后对象处理事件 现在我正在编写偶数处理程序方法 我希望使用 switch 语句来确定如何处理
  • Logback 配置在单行上有异常吗?

    我的日志被提取 传输并合并到 elasticsearch 中 多行事件很难跟踪和诊断 有没有办法使用收集器和正则表达式将异常行分组到单个记录中登录配置 https logback qos ch manual layouts html xTh
  • 如何安装JSTL?绝对uri:http://java.sun.com/jsp/jstl/core无法解析[重复]

    这个问题在这里已经有答案了 这是我的 JSP 页面的 taglib 指令 我收到以下错误 HTTP Status 500 type Exception report message description The server encoun
  • Java J文件选择器

    我希望能够控制外观JFileChooser 我特别想保存如何JFileChooser上次显示时显示 我想保存它是否在详细信息 列表视图中使用以及列表被排序的列 例如 大小或修改日期 我知道有很多关于JFileChooser但我一直没能找到我
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • 如何解决声纳中的 dodgy:unchecked/unconfirmedcast 问题?

    我在下面的代码中通过声纳获得异常 我该如何解决这个问题 建议我 Override public boolean validate BaseInfo infoObject boolean isValid true AckTransferPay
  • 为什么这段代码可以在 Java 7 中运行,而不能在 Java 8 中运行?

    我目前使用 IDE Eclipse 版本 Neon 2 Release 4 6 2 和版本 java Version 8 Update 131 在此代码中 IDE 给出错误 类型不匹配 无法从字节转换为整数 Integer i byte 1
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • Java如何区分这些具有相同名称/签名的多个方法?

    今天我在追踪一个错误 我注意到我们的一个班级中有一些奇怪的事情 我删除了尽可能多的代码并发布在这里 class A static int obtainNumber return 42 static int obtainNumber retu
  • 使用mapstruct映射不同类型列表的元素

    我们正在映射一个对象 该对象具有一个对象列表 这些对象都实现了父接口 但可能具有不同的实现 但当我们映射列表时 似乎只有来自 ParentClass 的值被映射 而不是来自子类的值 但直接映射子进程就可以了 public class Par
  • Spark java:如何处理多部分/表单数据输入?

    我在用spark http sparkjava com 开发网络应用程序 当我想上传文件时出现问题 public final class SparkTesting public static void main final String a
  • 使用 System.out.println 显示特殊字符

    我在将带有特殊字符的文本从网络服务发送或显示到数据库时遇到问题 在我的 Eclipse 上 我已将字符编码设置为 UTF 8 但它仍然不允许我显示字符 例如 像下面的代码一样简单的打印 String test System out prin
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • eclipse.ui.menus 的名称过滤器

    我有一个菜单贡献 通过实现org eclipse ui menus扩展点 我想仅为特定文件扩展名 例如 pld 提供此菜单贡献 但我不知道如何使用 visibleWhen 来做到这一点 有任何想法吗 更新 到目前为止我的扩展点
  • 最新版本 6.* Struts2 支持 Tomcat 10 吗? [复制]

    这个问题在这里已经有答案了 最新版本 6 Struts2 支持 Tomcat 10 吗 异常启动过滤器 struts2 java lang ClassCastException class org apache struts2 dispat

随机推荐

  • 程序员学习网站

    包括框架学习 涉及到Google源码的介绍 转载于 http www ha97 com 2908 html 程序员一般都会浏览哪些网站 转载于 http www ha97 com 2908 html 极客导航 转载于 http www go
  • RMQ(区间最值查询问题)

    简介 RMQ Range Minimum Maximum Query 问题是指 对于长度为 n 的数列 A 回答若干询问 RMQ A i j i j n 返回数列A中下标在 i j 里的最小 大 值 也就是说 RMQ问题是指求区间最值的问题
  • 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

    云服务器是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务 通常来说 平台的每个集群节点被部署在互联网的骨干数据中心 可以独立提供计算 存储 在线备份 托管 带宽等互联网基础设施服务 关注的是高性能吞吐量计算能力 关注的是在一段时间内的
  • 多网卡的情况下收udp组播数据的坑

    多网卡的情况下收udp组播收不到 有可能是如下原因造成 https www cnblogs com xiaouisme p 12658554 html
  • 【设计】OOA、OOD、OOP

    这三者都是 OO Object Oriented 领域的思想 一般我们我们接到产品经理的需求后 开发阶段分这样几个步骤 可行性预研阶段 此阶段评估需求是否合理 能否实现 OOA阶段 此阶段分析用例 定义领域模型 OOD阶段 此阶段定义类图
  • Chat 插件上线,免注册即可使用~

    OpenAI 新上线的 Chat 可谓是火爆出圈 这个语言对话模型可以回答问题 承认错误 挑战不正确的前提 还能帮你修改代码中的 bug Chat 的应用场景很广泛 它可以用于处理多种类型的对话 包括对话机器人 问答机器人和客服机器人等 它
  • 几种常用时钟分频实现方法

    在我们学习中 常常需要对时钟进行分频处理 本文将介绍几种常用分频方法 一 2的整数次幂分频 这种分频很简单 只需要设置一个计数器 对计数器进行计数 计数器的第i位则对应的2的i 1次幂分频 此方法适用于占空比为1 2 如果占空比不为1 2
  • CentOS7安装Docker详细步骤

    查看此文章前强烈建议先看这篇文章 Java江湖路 专栏目录 前言 记录在CentOS7中安装docker的每一个步骤 1 Docker介绍 什么是docker 虚拟化容器技术 Docker基于镜像 可以秒级的启动各种容器 每一种容器都是一个
  • 使用cloudflare-pages托管网站

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 如何白嫖省心的CloudFlare Pages服务 完美替代Github Pages 对大陆网络友好 背景 之前自己重新开始写博客了 为了方便本地md笔记 参考个人笔
  • [Orangepi 3 LTS]学习记录(一)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 准备香橙派开发板 闪迪TF卡 性能会更好一些 TF读卡器 USB转TTL模块 串口调试 HDMI 桌面登录 一 镜像安装 1 版本选择 下载对
  • WAF防火墙

    添加依赖 一下看情况而添加 不确定需不需要 apt get install gcc libpcre3 libpcre3 dev zlib1g dev tengine依赖 sudo apt get install openssl libssl
  • Nginx里的root/index/alias/proxy_pass的意思

    1 alias 别名配置 用于访问文件系统 在匹配到location配置的URL路径后 指向 alias 配置的路径 如 注意alias配置最后一定要有 而root可以没有 location test alias home sftp img
  • LEFT JOIN 和JOIN 多表连接

    转载 https blog csdn net mccand1234 article details 51734713 四张表contract customer customer3 customer4 这是比较熟悉的3张表的连接 SELECT
  • three.js全景视频

    小生最近学习three js 将three js官网提供的网站实例翻译翻译 共同学习 接下来翻译一下 webgl video panorama equirectangular html 运行结果https threejs org examp
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

    0 前言 注册中心不应仅提供服务注册和发现功能 还应保证对服务可用性监测 对不健康的服务和过期的进行标识或剔除 维护实例的生命周期 以保证客户端尽可能的查询到可用的服务列表 因此本文介绍Nacos注册中心的健康检查机制 1 注册中心的健康检
  • 在线代码编译运行工具

    在线代码编译运行工具 如果需要学习语言 比如练习一些算法 或者跑一些别人写的代码 有一些语言特性不太了解需要写一些简单的 demo 做一些验证 那么先搭建一个环境去跑就有一点麻烦了 无需搭建本地环境的代码在线运行工具就可以派上用场了 在线代
  • Mybatis 中$与#的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • Linux环境里实现FLink项目的Zookeeper与Kafka启动

    1 配置FLink遇到的坑 启动 start cluster sh后提示Permission denied 用sudo会提示Please specify JAVA HOME Either in Flink config conf flink
  • C#串口SerialPort常用属性方法

    SerialPort 属性 BaudRate 获取或设置波特率 BytesToRead 得到 接收到数据的字节数 BytesToWrites 得到送往串口的字节数 DataBits 获取或设置数据位 IsOpen 获取一个值 判断串口是否打
  • SpringBoot结合Redis将Token存入缓存中进行登录

    将登录的Token存储在Redis中可以带来以下好处 提高安全性 将Token存储在Redis中 比将Token保存在本地Cookie或浏览器存储中更加安全 因为攻击者无法访问您的服务器上存储的Token 此外 由于Redis支持设置过期时