0

0

Java实现分布式Session的Token方案

蓮花仙者

蓮花仙者

发布时间:2025-07-08 14:43:01

|

897人浏览过

|

来源于php中文网

原创

分布式系统中解决session共享问题的方法是采用token方案。1. 用户登录验证后,服务器生成包含用户id、过期时间和签名的token;2. 服务器将token返回客户端,客户端存储于cookie、localstorage或sessionstorage;3. 每次请求时客户端携带token,服务器验证其有效性,包括检查过期时间、签名正确性及可选的吊销状态;4. 验证通过后,服务器根据token信息授权访问。token方案的优势为无状态、跨域支持和安全性,劣势包括长度较长、吊销困难和密钥泄露风险。存储方式选择上,cookie更安全但易受csrf攻击,localstorage和sessionstorage适合大容量但易受xss攻击。token刷新机制可通过滑动过期或refresh token实现,后者需生成长期有效的refresh token用于换取新token。防止篡改依赖签名算法如hmac、rsa或ecdsa,结合加密提升安全性。

Java实现分布式Session的Token方案

在分布式系统中,由于服务被部署在多个节点上,传统的Session机制无法跨服务器共享,因此需要一种分布式Session的解决方案。Token方案是一种常见的选择,它通过在客户端存储一个令牌(Token),并在每次请求时携带该令牌,服务器验证令牌的有效性来维持会话状态。

Java实现分布式Session的Token方案

解决方案

  1. 用户登录验证: 用户提交用户名和密码进行登录。

    立即学习Java免费学习笔记(深入)”;

    Java实现分布式Session的Token方案
  2. 生成Token: 验证成功后,服务器生成一个Token。这个Token通常包含用户ID、过期时间、以及一些防止篡改的信息,例如使用HMAC算法进行签名。

    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import io.jsonwebtoken.security.Keys;
    
    import java.security.Key;
    import java.util.Date;
    import java.util.UUID;
    
    public class TokenGenerator {
    
        private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 实际应用中应使用更安全的密钥管理
    
        public static String generateToken(String userId) {
            Date now = new Date();
            Date expiryDate = new Date(now.getTime() + 3600000); // Token有效期设置为1小时
    
            return Jwts.builder()
                    .setId(UUID.randomUUID().toString())
                    .setSubject(userId)
                    .setIssuedAt(now)
                    .setExpiration(expiryDate)
                    .signWith(SECRET_KEY)
                    .compact();
        }
    
        public static String getUserIdFromToken(String token) {
            return Jwts.parserBuilder()
                    .setSigningKey(SECRET_KEY)
                    .build()
                    .parseClaimsJws(token)
                    .getBody()
                    .getSubject();
        }
    
        public static boolean validateToken(String token) {
            try {
                Jwts.parserBuilder().setSigningKey(SECRET_KEY).build().parseClaimsJws(token);
                return true;
            } catch (Exception e) {
                // Token验证失败,例如过期、签名错误等
                return false;
            }
        }
    
        public static void main(String[] args) {
            String userId = "user123";
            String token = generateToken(userId);
            System.out.println("Generated Token: " + token);
    
            String extractedUserId = getUserIdFromToken(token);
            System.out.println("User ID from Token: " + extractedUserId);
    
            boolean isValid = validateToken(token);
            System.out.println("Token is valid: " + isValid);
        }
    }
  3. 返回Token: 服务器将生成的Token返回给客户端。

    Java实现分布式Session的Token方案
  4. 客户端存储Token: 客户端将Token存储在Cookie、LocalStorage或SessionStorage中,具体选择取决于安全性和需求。

  5. 请求携带Token: 客户端在每次发起请求时,将Token放在请求头(Authorization)或请求体中。

  6. 服务器验证Token: 服务器接收到请求后,从请求头或请求体中提取Token,并验证其有效性。验证包括:

    • 检查Token是否过期。
    • 验证Token的签名是否正确。
    • (可选)查询Redis或其他缓存,确认Token是否被吊销。
  7. 授权访问: 如果Token验证通过,服务器根据Token中包含的用户ID或其他信息,授予用户访问权限。

Token方案的优势:

云商商城系统
云商商城系统

云商商城系统,即云商未来商城系统,云商商城系统提供完整的电子商务解决方案。云商商城系统集CMS、B2C、B2B2C、B2B、C2B、SNS用户社区于一体,包括网站商城、微信商城、手机商城等多种交易模式,支持实现不同模式的O2O电子商务平台。为企业树立企业品牌形象,实现独立网络推广,批发、零售,供应商加盟,并充分结合网站SEO、微博、APP,微信等移动客户端多渠道网络营销手段,实现线上线下统一管理,

下载
  • 无状态: 服务器不需要存储Session信息,减轻了服务器的负担,易于扩展。
  • 跨域: Token可以跨域使用,方便构建分布式系统。
  • 安全性: 通过签名和加密,可以防止Token被篡改。

Token方案的劣势:

  • Token长度: Token的长度相对较长,可能会增加网络传输的负担。
  • Token吊销: Token一旦生成,在过期之前都是有效的。如果需要吊销Token,需要额外的机制,例如使用Redis存储已吊销的Token。
  • 安全性: 如果密钥泄露,Token将被伪造。

如何选择合适的Token存储方式?Cookie vs. LocalStorage vs. SessionStorage

选择哪种Token存储方式取决于具体的应用场景和安全需求。

  • Cookie: 可以设置HttpOnly属性,防止客户端脚本访问Cookie,提高安全性。Cookie可以设置过期时间,并且可以自动在每次请求时发送到服务器。但是,Cookie的大小有限制,并且容易受到CSRF攻击。
  • LocalStorage: 可以存储大量数据,并且不会自动发送到服务器,可以减少网络传输的负担。但是,LocalStorage容易受到XSS攻击,因为客户端脚本可以访问LocalStorage中的数据。
  • SessionStorage: 与LocalStorage类似,但是SessionStorage只在当前会话中有效,当浏览器关闭时,SessionStorage中的数据会被清除。SessionStorage也容易受到XSS攻击。

一般来说,如果对安全性要求较高,建议使用HttpOnly Cookie存储Token。如果对存储空间有要求,并且可以接受一定的安全风险,可以使用LocalStorage或SessionStorage存储Token。

如何实现Token的刷新机制?

Token的刷新机制可以延长用户的会话时间,避免用户频繁登录。常见的Token刷新机制有两种:

  • 滑动过期: 每次用户访问服务器时,服务器都会更新Token的过期时间。这样,只要用户持续访问服务器,Token就会一直有效。
  • Refresh Token: 服务器在生成Token的同时,还会生成一个Refresh Token。Refresh Token的过期时间比Token长。当Token过期时,客户端可以使用Refresh Token向服务器申请新的Token。

滑动过期实现:

public String refreshToken(String token) {
    if (!validateToken(token)) {
        return null; // Token 无效
    }

    String userId = getUserIdFromToken(token);
    return generateToken(userId); // 生成新的 Token
}

Refresh Token实现:

  1. 用户登录成功后,服务器同时生成Access Token和Refresh Token。
  2. 客户端保存Access Token和Refresh Token。
  3. Access Token过期后,客户端使用Refresh Token向服务器请求新的Access Token。
  4. 服务器验证Refresh Token的有效性。
  5. 如果Refresh Token有效,服务器生成新的Access Token和Refresh Token,并返回给客户端。
  6. 客户端更新Access Token和Refresh Token。

Refresh Token机制需要考虑Refresh Token的存储和管理,以及Refresh Token的安全性。

如何防止Token被篡改?

防止Token被篡改的关键是使用签名算法。常见的签名算法有HMAC、RSA和ECDSA。

  • HMAC: 使用对称密钥进行签名。HMAC算法速度快,但是安全性相对较低,因为对称密钥需要保存在服务器端。
  • RSA: 使用非对称密钥进行签名。RSA算法安全性高,但是速度相对较慢。
  • ECDSA: 使用椭圆曲线密码学进行签名。ECDSA算法在安全性和速度之间取得了平衡。

在使用签名算法时,需要选择合适的密钥长度。密钥长度越长,安全性越高,但是计算复杂度也越高。

除了使用签名算法外,还可以使用加密算法对Token进行加密,进一步提高Token的安全性。

选择哪种签名算法和加密算法取决于具体的安全需求和性能要求。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

235

2023.10.07

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6427

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

413

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

93

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

315

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

751

2023.10.18

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

Bootstrap4.x---十天精品课堂
Bootstrap4.x---十天精品课堂

共22课时 | 1.7万人学习

Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号