Java实现JWT令牌技术

本文介绍了三种主要的会话保持技术:Cookie,Session和Jwt,重点讲解了Jwt如何解决Cookie和Session的安全及集群环境下的问题。通过Java实现了一个JwtUtil类,用于生成和解析Jwt令牌,展示了其实现过程和测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在web应用方面,主要的会话保持技术有三种,分别是Cookie,Session和Jwt技术,cookie将数据明文保存在客户端,有严重的安全问题,session基于cookie实现,将sessionId保存在cookie中,将真实数据保存在服务端,成功的解决了安全问题,但是session是基于cookie实现的,所有他还存在一些问题,比如现在企业服务器大多以集群的形式存在,web请求被负载均衡服务器随机指定集群中的一台服务器处理,可能在该台服务器中不存在sessionId对应的数据。cookie和session不支持移动端,也不能跨域。

jwt(Json Web Token)令牌技术正是为解决上述问题而出现的,它由客户端保存,由签名算法信息,自定义信息和密钥三部分组成。4a797f25dc4542ef9b376e1ddfabde8b.png

 接下来使用java实现jwt令牌的生成和解析

首先导入相关依赖

            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.2</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.2</version>
        </dependency>

然后实现一个Jwt类

public class JwtUtil {
    private static final SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;//指定加密算法
    private static final Long expire= (long) (60*60*1000);//设置有效时间
    private static final String secret="mynameiszoffyandhisnameisminghuang";//设置密钥
    public String GenerateJwt(Map<String,Object> claims){
        Key signatureKey=new SecretKeySpec(secret.getBytes(),signatureAlgorithm.getJcaName());
        return Jwts.builder()
                .signWith(signatureKey,SignatureAlgorithm.HS256)//设置签名方式
                .addClaims(claims)//设置自定义消息
                .setExpiration(new Date(System.currentTimeMillis()+expire))//设置过期时间
                .compact();
    }
    public  Map<?,?> ParseJwt(String jwt){
        Key signatureKey=new SecretKeySpec(secret.getBytes(),signatureAlgorithm.getJcaName());
        Object body=Jwts.parserBuilder()
                .setSigningKey(signatureKey)
                .build()
                .parse(jwt)
                .getBody();
        return (Map<?,?>)body;

    }
    
}

 

测试一下

public static void main(String[] args){
        JwtUtil jwtUtil=new JwtUtil();
        Map<String,Object> map=new HashMap<>();
        map.put("name","zoffy");
        map.put("hello","chen");
        String jwt=jwtUtil.GenerateJwt(map);
        System.out.println(jwt);
        System.out.println(jwtUtil.ParseJwt(jwt));
    }

 

成功eef0f70d23dd48ae91d5ef69495d0603.png

 

 

### 解决JWT令牌相关错误的方法 当遇到JWT令牌相关的错误时,通常可以从以下几个方面入手分析并解决问题: #### 1. **验证签名失败** 如果服务器无法验证JWT的签名,则可能是由于密钥不匹配或算法配置不当引起的。确保客户端和服务器端使用的加密算法一致,并且共享相同的秘密密钥。 ```python import hmac import hashlib def validate_signature(encoded_content, secret_key): expected_signature = hmac.new(secret_key.encode(), msg=encoded_content.encode(), digestmod=hashlib.sha256).hexdigest() return expected_signature ``` 上述代码展示了如何通过HMAC SHA-256生成签名[^2]。务必确认`secret_key`在服务端和客户端之间保持一致性。 #### 2. **过期时间设置不合理** JWT中的`exp`字段定义了令牌的有效期限。如果该值被误设或者未正确解析,可能会引发“Token expired”的错误提示。检查payload部分是否有合法的时间戳表示形式。 ```json { "alg": "HS256", "typ": "JWT" } . { "sub": "1234567890", "name": "John Doe", "iat": 1516239022, "exp": 1516239082 } ``` 以上JSON片段显示了一个典型的JWT结构,其中包含了签发时间和到期时间的信息。 #### 3. **依赖库版本冲突** 某些情况下,不同版本的安全框架可能引起兼容性问题。例如,在Spring Boot项目里引入security组件时需要注意其与核心模块之间的协调关系[^3]。 对于基于Micronaut的应用程序来说也是如此——它会返回带有JWT token 的 JSON 响应体用于后续的身份认证操作;然而这要求开发者妥善管理好各个插件间的相互作用以免发生意外状况[^1]。 #### 4. **授权模式选用失误** 依据实际需求选取恰当类型的OAuth 2.0 flow至关重要。每种grant types都有各自适用范围以及风险考量因素[^4]: - Authorization Code Grant Type适合于安全性较高的Web Apps 和 Mobile Apps; - Implicit Grant Type更适合那些运行在浏览器环境下的Single Page Applications(SPA); - Resource Owner Password Credentials Grant Type则常应用于特定场景下直接获取资源拥有者凭证的情况; - Client Credentials Grant Type主要针对一些后台进程或者是完全由系统控制的服务调用方. 综上所述,要彻底排查并修复JWT Token Errors就需要综合考虑多个维度的因素包括但不限于秘钥同步情况、token生命周期设定准确性、所采用的技术栈稳定性及其内部协作机制等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰宝IWZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值