实例详解:Java使用JWT和Redis实现高效单点登录(SSO)
前言
单点登录(Single Sign-On,简称SSO)是一种身份验证和访问控制机制,允许用户使用一组凭证(如登录名和密码)登录到多个应用程序中,而无需为每个应用程序单独进行身份验证。用户只需要登录一次就可以访问所有系统的应用和资源。相对于传统的每个系统都需要登录一次的方式,单点登录可以提高用户体验,降低用户的登录成本。在本文中,我们将通过使用JWT(JSON Web Token)和Redis来实现SSO功能,并提供详细的Java代码实例。
一、实现单点登录的步骤
-
设计登录系统
设计登录系统时,需要考虑如何通过登录信息验证用户身份,并生成令牌(Token),同时将Token保存在服务器端和客户端。 -
实现令牌传递和验证
在用户通过登录系统进行登录和身份验证后,应用程序要将Token返回给客户端,由客户端在访问其他应用时携带Token进行验证。 -
支持跨域访问
由于SSO需要支持不同的域名和端口之间的单点登录,所以应用程序需要支持跨域访问。传统的方式是使用Cookies来处理SSO,但如果采用Cookies,会有跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的安全问题。因此,在现代Web应用程序中,通常使用 JSON Web Token(JWT)或OAuth 2.0来实现单点登录和授权。
二、Java实现单点登录的代码示例
下面,我们给出一个基于Spring Boot和JWT和Redis的Java实现单点登录的样例代码。
1.添加依赖
在我们的Spring Boot项目中,添加如下JWT和Redis的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.11.2</version>
</dependency>
2.配置Redis连接:
在application.properties文件中添加以下Redis连接信息:
spring:redis:host: localhostport: 6379password: your_pwdjedis:pool:max-active: 1024max-wait: 10000max-idle: 200min-idle: 10timeout: 10000
jwt:secret: your_secret_keytoken:expireTime: 3600
3.实现JWT Token工具类:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Component
public class JwtTokenUtil {@Value("${jwt.secret}")private String secret;@Value("${jwt.token.expireTime}")private Long expireTime;private final String TOKEN_CACHE_PREFIX = "token:";@Autowiredprivate RedisTokenUtils redisTokenUtils;public String generateToken(String username) {Map<String, Object> claims = new HashMap<>();claims.put("sub", username);claims.put("created", new Date());String token = Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate()).signWith(SignatureAlgorithm.HS512, secret).compact();redisTokenUtils.setToken(TOKEN_CACHE_PREFIX + username, token);return token;}// 其他方法...// 注意事项:// - 加密密钥(secret)需要保密且足够复杂。// - JWT Token的有效期应根据实际需求进行设置。
}
4.实现Redis Token存储工具类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.concurrent.TimeUnit;@Component
public class RedisTokenUtils {@Value("${jwt.token.expireTime}")private Long expireTime;@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void setToken(String key, Object value) {redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.MINUTES);}public void deleteToken(String key) {redisTemplate.delete(key);}// 其他方法...// 注意事项:// - Redis的连接配置需要正确设置。// - Token的存储和删除应在合适的时机进行。
}
5. 实现登录逻辑:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class AuthService {@Autowiredprivate JwtTokenUtil jwtTokenUtil;public String login(String username, String password) {// 验证用户名和密码的逻辑// ...String token = jwtTokenUtil.generateToken(username);return token;}
}
6. 实现登出逻辑:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class AuthService {@Autowiredprivate JwtTokenUtil jwtTokenUtil;public void logout(String username) {jwtTokenUtil.deleteToken(username);}
}
三、注意事项
在使用JWT和Redis实现SSO时,需要注意以下事项:
- 密钥(secret)的安全性很重要,并应保密且足够复杂。比如:在生成Token时,使用合适的算法进行签名,以确保Token的安全性。验证Token时,需要使用相同的算法和密钥进行解密和验证。同时,还需要对Token的合法性进行校验,比如检查Token是否过期、是否被篡改等。
- 令牌的有效期应根据实际需求进行设置,过长的有效期可能会增加安全风险,而过短的有效期可能会导致频繁的重新登录。
- 在用户登出或注销操作时,应及时删除对应的令牌,以避免令牌被滥用。
总结
通过结合JWT和Redis,我们可以轻松实现单点登录(SSO)的功能。JWT用于生成和验证令牌,而Redis用于存储和管理令牌。JWT提供了一种轻量级的、无状态的身份验证机制,而Redis则提供了持久化存储和高性能的缓存功能。通过这样的组合,我们可以实现身份认证的高效和可靠,同时提供了可配置的令牌有效期功能,保证了系统的安全性。
相关文章:
实例详解:Java使用JWT和Redis实现高效单点登录(SSO)
前言 单点登录(Single Sign-On,简称SSO)是一种身份验证和访问控制机制,允许用户使用一组凭证(如登录名和密码)登录到多个应用程序中,而无需为每个应用程序单独进行身份验证。用户只需要登录一次…...
SQL中使用ROLLUP和CUBE函数轻松生成汇总行
在数据分析和报表制作中,通常需要对数据进行汇总和分组,我们常用的就是GROUP BY汇总数据,当我们想按照不同维度汇总时,往往需要编写多个GROUP BY预计,而借助ROLLUP 和 CUBE 函数可以一次性生成子总计和总计行ÿ…...
CentOS 7 安装和配置java环境
1 安装包准备 安装包可以通过下面地址进行版本选择安装: https://www.oracle.com/java/technologies/downloads/#java8 2 正式开始安装 本次分享的安装方法直接通过编辑/etc/profile文件实现java的安装 2.1 新建安装包存放目录 mkdir /java cd /java/ 2.2 解压安…...
「实验记录」CS144 Lab0 networking warmup
文章目录 一、Motivation二、SolutionsS1 - Writing webgetS2 - An in-memory reliable byte stream 三、Results四、Source 一、Motivation 第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容,这并没有太大的难度&…...
html5怎么实现语音搜索
html5怎么实现语音搜索 谷歌的网站在他们首页发现了HTML5的新玩法——语音搜索。 注意: 只有webkit核心的浏览器才能使用 用法很简单 只需要在input添加属性x-webkit-speech即可,例子如下: 代码如下: <input type"text" x-…...
吴恩达《机器学习》1-2:什么是机器学习?
一、什么是机器学习? Arthur Samuel(1959): 他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力的领域。 Tom Mitchell(1998): 他定义的机器学习是,…...
基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能
#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint #define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚 #define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚 sbit LED P1^0;//位定义…...
Linux环境开发工具yum、makefile的使用 【Linux】
文章目录 Linux软件包管理器 - yumLinux下安装软件的方式yum查找软件包如何实现本地机器和云服务器之间的文件互传卸载软件Linux编译器 - gcc/g 程序的翻译过程1.预编译(预处理)2.编译(生成汇编)3.汇编(生成机器可识别…...
第六章(6):Python中的函数—闭包和装饰器
1.闭包 在Python中,闭包是指函数与其相关的自由变量的一个整体。当一个函数返回了一个内部函数时,这个内部函数可以访问其定义所在的外部函数中的变量,即使这个外部函数已经返回了。这种特性就叫做闭包。 代码示意: def funca():x = 250def funcb():print(我仍然可以访问…...
Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学
一,操作系统介绍 1.1.什么是操作系统 操作系统(Operating System,简称OS)是一种系统软件,它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源,为应用程序提供接口和服务,并协调…...
基于SSM的个性化美食推荐系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
Django 全局配置 settings 详解
文章目录 1 概述1.1 Django 目录结构 2 常用配置:settings.py2.1 注册 APP:INSTALLED_APPS2.2 模板路径:TEMPLATES2.3 静态文件:STATICFILES_DIRS2.4 数据库:DATABASES2.5 允许访问的主机:ALLOWED_HOSTS 1 …...
uniapp接口请求api封装,规范化调用
封装规范和vue中的差不多,都是统一封装成一个request对象,然后在api.js里面调用。 先创建一个utils文件夹,然后里面创建一个request.js,代码如下: export const baseURL 基础url地址const request (options) > …...
色彩校正及OpenCV mcc模块介绍
一、术语 1.光:是电磁波,可见光是可被人眼感知的电磁波。可见光大约在400-700nm波段。光子携带的能量与波长成反比,400nm--700nm之间的单色光的颜色从紫色渐变成红色。 2.光谱:除了太阳光源外,LED灯、白炽灯等各种照明…...
2023mathorcup大数据数学建模竞赛A题坑洼道路识别67页完整高质量原创论文
大家好,从昨天肝到现在,终于完成了本次mathorcup大数据数学建模竞赛A题基于计算机视觉的坑洼道路检测和识别的完整论文了。 给大家看一下目录吧: 摘 要: 10 一、问题重述 12 二.问题分析 13 2.1问题一 13 2.2问题…...
【k8s】5、资源管理命令-声明式
目录 一、 yaml和json介绍 1、yuml语言介绍 2、k8s支持的文件格式 3、yaml和json的主要区别 二、声明式对象管理 1、命令式对象配置 2、声明式对象配置 3、声明式对象管理命令介绍 三、编写资源配置清单 1、 编写yaml文件 2、 启动并查看资源 3、创建service服务对外…...
信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】
信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】 课本里章节里所有蓝色字体的思维导图...
【Flutter】Flutter 中的图片管理 图片优化的最佳实践
【Flutter】Flutter 中的图片管理 图片优化的最佳实践 文章目录 一、前言二、图片资源的重要性1. 对于项目复杂性的影响2. 性能和资源优化3. 国际化和多平台支持4. UI/UX 的角度看图片管理5. 图片资源与应用安全三、Flutter 中的图片资源分类1. Asset 图片2. 网络图片3. 本地文…...
dash--项目的前端展示简单基础
1.前置工作 创建虚拟环境: sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境(也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv) source venv/bin/activate # 激活虚拟环境临时使用清华…...
LeetCode 面试题 16.06. 最小差
文章目录 一、题目二、C# 题解 一、题目 给定两个整数数组 a 和 b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差 示例: 输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8} 输出&…...
从拉灯呼叫到闭环处理:安灯管理软件操作流程能解决哪些场景痛点?一套安灯管理软件操作流程实战
在制造工厂的生产现场,异常就像不速之客,总在最忙的时候敲门。设备突然停机、物料没送到位、质量出现批量不良……这些异常发生后,最让人头疼的往往不是问题本身,而是处理问题的过程。工人发现设备停了,扯着嗓子喊班长…...
JMeter接口断言实战:从响应匹配到业务逻辑校验
1. 断言不是“加个勾就完事”的装饰品,而是接口测试的判决书很多人第一次在JMeter里点开“添加 → 断言 → 响应断言”,填上一个“包含文本:success”,跑完看绿色小对勾亮了,就以为测试通过了——结果上线后接口明明返…...
【习题05】求n的阶乘
题目: 分别利用递归和非递归的方法求n的阶乘 1、题目分析 规定:0的阶乘为1。 非递归: 我们先列举几个求阶乘的案例,从中找寻规律。 0! 11! 12! 1 * 23! 1 * 2 * 3 从上述几个例子可…...
软考中级《嵌入式系统设计师》全套备考资料(真题 + 教材 + 笔记)
大家好,今天给大家分享一份软考中级「嵌入式系统设计师」的完整备考资料包,从教材、真题到高频笔记全配齐,帮你省去整理资料的时间,直接进入高效备考状态! 📁 资料清单 这套资料覆盖了嵌入式系统设计师备考…...
Github创建项目(创建仓库、新建项目、新建仓库)步骤
文章目录 新建项目然后根据指示创建第一个提交并推送即可 新建项目 然后根据指示创建第一个提交并推送即可 echo "# xxxxxxxx" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin ht…...
聊一聊5家软件许可优化公司,哪个更适合你?
做软件资产管理的朋友应该都有同感:软件许可这事儿,水太深了。尤其这几年大厂审计越来越狠,一不小心就是几百万的罚单。所以很多公司开始找专门做软件许可优化的服务商。今天聊聊5家比较有代表性的:、Flexera、Snow、Anglepoint和…...
抖音批量下载解决方案:模块化架构与智能降级策略
抖音批量下载解决方案:模块化架构与智能降级策略 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...
vcs+verdi+vivado联合仿真
1.软件版本vivado和vcs的软件版本兼容Xilinx官方指导手册UG973本次使用的Vivado版本为2018.2图为Vivado2018.2支持的vcs版本,此时vcs有vcs和vcs-mx两种版本。VCS和VCS_MX的区别VCS_MX为mixed hdl 仿真器,支持vhdlverilogsv的混合仿真。vcs则是纯verilog的…...
2026年京东云OpenClaw/Hermes Agent配置Token Plan全步骤操作指南
2026年京东云OpenClaw/Hermes Agent配置Token Plan全步骤操作指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具…...
2026年同步网盘哪个好?10款支持本地文件夹自动同步与实时备份工具盘点
在 2026 年,数据即资产。传统“手动上传”已难以满足高频办公:文件一多就容易漏传、版本混乱、协作效率下降。本地文件夹自动同步(落盘即上云)正在成为衡量网盘生产力的核心指标——既能防止硬盘故障导致的数据丢失,也…...
