广告
返回顶部
首页 > 资讯 > 后端开发 > Python >在Java中使用Jwt的示例代码
  • 426
分享到

在Java中使用Jwt的示例代码

2024-04-02 19:04:59 426人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录Jwt 特点 1. JWT 的原理 2. JWT 的数据结构 2.1 Header 2.2 Payload 2.3 Signature 3. 在 Java 中使用 JWT 特点

JWT 特点

JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

JWT 不加密的情况下,不能将秘密数据写入 JWT。

JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。

JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

1. JWT 的原理

Jwt官网:https://jwt.io/

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。


{
  "name": "John Doe",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 jsON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

2. JWT 的数据结构

JWT 大概就像下面这样。

eyJhbGCiOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2Qt4fwpMeJf36POk6yJV_adQssw5c

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个组成部分依次如下。

  • · Header(头部)
  • · Payload(负载)
  • · Signature(签名)

# 写成一行,就是下面的样子
Header.Payload.Signature

2.1 Header

Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。


{
  "alg": "HS256",
  "typ": "JWT"
}

上面代码中,alg属性表示签名的算法(alGorithm),默认是 HMac SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。

最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。

2.2 Payload

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子


{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

这个 JSON 对象也要使用 Base64URL 算法转成字符串。

2.3 Signature

Signature 部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。


HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

3. 在 Java 中使用

依赖,这里使用的是 jjwt


<!-- Jwt Https://mvnrepository.com/artifact/io.jsonWEBtoken/jjwt -->
<dependency>
 <groupId>io.jsonwebtoken</groupId>
 <artifactId>jjwt</artifactId>
 <version>0.9.1</version>
</dependency>

使用


class DemoApplicationTests {
 // 加盐秘钥
 private String secret = "jwtSecretValue";

 public static void main(String[] args) {
  // 创建token
  String token = this.createToken(20);
//  String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.L1cCfQpCSzPOrxbHVqiMaT8ndRlZd2PuHzYE2TIqUA0";
  System.out.println("token --> " + token);

  // 解析token
  this.parseToken(token);
 }

 // 创建token
 public String createToken(Integer time) {
  // 过期时间, 默认10秒过期
  time = time == null ? 10 : time;
  long l = new Date().getTime() + time * 1000;
  Date expire = new Date(l);

  // 自定义信息
  Map<String, Object> map = new HashMap<>();
  map.put("name", "admin");

  JwtBuilder claim = Jwts.builder()
    // 设置签名算法和加盐秘钥
    .signWith(SignatureAlgorithm.HS256, secret)
    // 设置过期时间
    .setExpiration(expire)
    // 自定义内容接受一个map
    .setClaims(map)
    // 唯一id {"id": "9527"}
    .setId("9527")
    // JWT的主体 {"sub": "jwtSubject"}
    .setSubject("jwtSubject")
    // jwt的签发时间 {"iat": "1618383146"}
    .setIssuedAt(new Date());
    // 自定义内容{"name": "admin"}
//    .claim("name", "admin");

  String token = claim.compact();

  // 解析token, jwt是经过Base64编码的
//  String[] ts = token.split("\\.");
//  for (String s : ts) {
//   System.out.print(s + " --> ");
//   System.out.println(Base64Codec.BASE64.decodeToString(s));
//  }
//  System.out.println("===============================");

  return token;
 }

 // 解析token
 public void parseToken(String token) {
  System.out.println("====================开始解析JWT====================");

  System.out.println("token --> " + token);
  try {
   Claims body = Jwts.parser()
     // 签名秘钥
     .setSigningKey(secret)
     // 要解析的jwt
     .parseClaimsJws(token)
     .getBody();

   System.out.println("id --> " + body.getId());
   System.out.println("sub --> " + body.getSubject());
   System.out.println("自定义内容 name --> " + body.get("name"));
   System.out.println("iat 创建时间 --> " + body.getIssuedAt());
   Date expiration = body.getExpiration();
   System.out.print("过期时间 --> ");
   System.out.println(expiration == null ? expiration : expiration.toLocaleString());
  } catch (Exception e) {
   e.printStackTrace();
   System.out.println("无效Token");
  }
  System.out.println("====================JWT解析结束====================");
 }
}

到此这篇关于在Java中使用Jwt的示例代码的文章就介绍到这了,更多相关Java使用Jwt内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 在Java中使用Jwt的示例代码

本文链接: https://www.lsjlt.com/news/124139.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在Java中使用Jwt的示例代码
    目录JWT 特点 1. JWT 的原理 2. JWT 的数据结构 2.1 Header 2.2 Payload 2.3 Signature 3. 在 Java 中使用 JWT 特点 ...
    99+
    2022-11-12
  • nodejs实现jwt的示例代码
    目录1.为什么需要会话管理2.session和cookies3.jwt的定义4.jwt的原理5.jwt的认证流程6.jwt的数据结构7.jwt使用方式8.在koa项目中使用9.原理的...
    99+
    2023-03-03
    node实现jwt node jwt
  • SpringBoot集成Auth0 JWT的示例代码
    目录前言session认证与Token认证session认证Token认证JWT简介JWT定义JWT的类库具体实现JWT配置JWT工具类测试接口前言 说说JWT,先说下互联网服务常见...
    99+
    2022-11-12
  • golang原生实现JWT的示例代码
    目录获取Token解析Token实际使用测试结果结语JWT(JSON Web Token)是一种基于JSON的安全令牌,可以用于在不同系统之间传输认证信息。在Go中实现JWT验证,可...
    99+
    2023-05-19
    golang实现JWT golang JWT
  • 基于Springboot实现JWT认证的示例代码
    目录一、了解JWT概念作用1.1 为什么授权要使用jwt二、JWT结构2.1 header2.2 payload2.3 signature三、使用JWT3.1 上手3.2 封装工具类...
    99+
    2022-11-12
  • java Scanner类的使用示例代码
    Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间...
    99+
    2022-11-12
  • java使用es查询的示例代码
    众所周知,elasticsearch简称es,它是基于基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放...
    99+
    2023-05-30
  • 基于PHP实现JWT登录鉴权的示例代码
    目录一、什么是JWT1、简介2、JWT的组成3、JWT验证流程和特点二、相关问题三、PHP实现1、引入依赖2、功能实现3、封装工具类如下一、什么是JWT 1、简介 JWT(JSON ...
    99+
    2022-11-13
  • Node调用Java的示例代码
    Java 端作为服务提供者,基于Dubbo 实现服务并通过 Dubbo Hessian 扩展暴露服务;Node 端作为服务消费者,通过node-hessian 调用 Java 端的服务。 Java 端 服务...
    99+
    2022-06-04
    示例 代码 Node
  • Jwt如何在Java中使用
    这篇文章给大家介绍Jwt如何在Java中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是...
    99+
    2023-06-14
  • 如何在ASP.NET Core中使用Session的示例代码
    ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且 高度模块化的web框架,Session 可以实现用户信息存储从而可以在同一个客户端的多次请求之间实现用户追...
    99+
    2022-06-07
    net ASP.NET 示例 core session ASP
  • Vue3中使用pinia的示例代码
    目录1、安装:npm install pinia2、创建store文件并配置内部的index.js文件3、main.js文件中配置4、组件使用4-1、 store.$reset()&...
    99+
    2022-12-15
    Vue3中使用pinia Vue3 pinia使用
  • SpringBoot中使用RocketMQ的示例代码
    目录1 订单微服务发送消息1.1 订单微服务添加rocketmq的依赖1.2 添加配置1.3 编写测试代码1.4 测试2 用户微服务订阅消息2.1 用户微服务增加rocketmq依赖...
    99+
    2022-11-12
  • IDEA 中使用 Hudi的示例代码
    目录环境准备核心代码测试参考资料环境准备 创建 Maven 项目创建服务器远程连接Tools------Delployment-----Browse Remote Host 设置如...
    99+
    2022-11-13
  • springboot中使用groovy的示例代码
    目录GroovypomResourceScriptSourceDatabaseScriptSourceGroovy Groovy是一种基于Java的语法的基于JVM的编程语言。Gro...
    99+
    2022-11-13
  • Spring Boot 集成JWT实现前后端认证的示例代码
    目录前言JWT简介为什么要用JWT传统session认证存在那些弊端?JWT认证的优势JWT的数据结构HeaderPayloadSignatureSpring Boot集成JWT引入...
    99+
    2022-11-13
  • 在java中binarySearch的使用示例
    小编给大家分享一下在java中binarySearch的使用示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用的java框架有哪些1.SpringMVC,Sp...
    99+
    2023-06-14
  • .net core 中 WebApiClientCore的使用示例代码
    WebApiClient 接口注册与选项 1 配置文件中配置HttpApiOptions选项 配置示例 "IUserApi": { "HttpHost": "http://...
    99+
    2022-12-14
    .net core 中 WebApiClientCore使用 .net core  WebApiClientCore
  • springboot 使用 minio的示例代码
    什么是MinIo MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视...
    99+
    2022-11-13
  • vue3使用mqtt的示例代码
    目录vue3使用mqtt下面再看下vue3调用mqttvue3使用mqtt 封装类 //封装一个类(可直接cv) class createds { //创建公共变量 stat...
    99+
    2023-05-16
    vue3使用mqtt vue3 mqtt vue3调用mqtt
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作