栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JWT在Java中的使用详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JWT在Java中的使用详解

JWT在Java中的使用详解

文章目录
  • JWT在Java中的使用详解
    • 前言
    • 一、JWT是什么?
    • 二、JWT令牌结构
      • 1. Header 头部
      • 2. Payload 载荷
      • 3. Verify Signature 验证签名
    • 三、代码部分
      • 1.maven依赖
      • 2.代码部分
    • 总结
    • 博客声明


前言

由于Http协议是无状态的,早期的前后端交互依赖的是Cookie+Session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。但是如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。


一、JWT是什么?

JWT的英文全称为Json Web Token,中文翻译为令牌。JSON Web 令牌 (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。此信息可以进行验证和信任,因为它是经过数字签名的。(来自官网的翻译)

二、JWT令牌结构

JWT由3部分组成:头部(Header)、有效载荷(Payload)和验证签名(Signature)。
最后通过base64算法生成一串字符串。

1. Header 头部

JWT头是一个描述JWT元数据的JSON对象。
alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256)。
typ属性表示令牌的类型,JWT令牌统一写为JWT。

{
  "alg": "HS256",
  "typ": "JWT"
}
2. Payload 载荷

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。
载荷内部可以分为:

  1. 公共声明(默认提供七个字段供选择)
  2. 私有声明(开发者自定义的声明放在此处)
公共声明名称公共声明描述
iss发行者
sub主题
aud用户
exp过期时间
nbf在这个时间之前不可用
iat发布时间
jtiJWT的ID
3. Verify Signature 验证签名

签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名

三、代码部分

由于官网提供多种JWT实现(官方网站),这里只用到(com.auth0 / java-jwt)这个版本的jwt。

1.maven依赖

   com.auth0
   java-jwt
   3.19.2

2.代码部分
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;


public class TokenService {

    
    private Map headerClaim = new HashMap<>();

    
    private Map payloadClaim = new HashMap<>();

    
    protected static final long MILLIS_SECOND = 1000L;

    
    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;

    
    private final static String secret = "Andy's JWT DEMO";

    private static TokenService service;

    // 私有化构造器-单例模式
    private TokenService() {
    }

    
    public static synchronized TokenService creator() {
        if (service == null) {
            service = new TokenService();
        }
        return service;
    }

    
    public TokenService setHeaderClaim(Map headerClaim) {
        this.headerClaim = headerClaim;
        return this;
    }

    
    public TokenService setPayloadClaim(Map payloadClaim) {
        this.payloadClaim = payloadClaim;
        return this;
    }

    
    public String createToken() {
        return JWT.create()
                  // 设置过期时间为10分钟(这里可以自定义)
                  .withExpiresAt(new Date(System.currentTimeMillis() + 10 * MILLIS_MINUTE))
                  // 添加头部声明
                  .withHeader(headerClaim)
                  // 添加载荷声明
                  .withPayload(payloadClaim)
                  // 签发JWT字符串,这里需要传入一个加密算法
                  .sign(Algorithm.HMAC256(secret));
    }

    
    public static boolean checkToken(String tokenKey) {
        try {
            // 如果Token解析错误会抛出异常
            getDecodeToken(tokenKey);
        } catch (JWTVerificationException e) {
            return false;
        }
        return true;
    }

    
    private static DecodedJWT getDecodeToken(String tokenKey) {
        return JWT.require(Algorithm.HMAC256(secret)).build().verify(tokenKey);
    }

    
    public static Claim getHeaderClaim(String tokenKey, String claimName) {
        return getDecodeToken(tokenKey).getHeaderClaim(claimName);
    }

    
    public static Claim getPayloadClaim(String tokenKey, String claimName) {
        return getDecodeToken(tokenKey).getClaim(claimName);
    }

    
    public static Map getAllPayloadClaim(String tokenKey) {
        return getDecodeToken(tokenKey).getClaims();
    }
}
总结

以上代码使用了单例设计模式(懒汉式),是我本人对Token操作的一些简易封装。JWT这个框架在公司项目中几乎都会用到,这里给刚入门的同学一些代码参考。

博客声明

1.博客中标注原创的文章,版权归原作者 newCodeWorker(英文名Andy) 所有;

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/952981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号