JWT是什么?

JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。

JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任为不可读(即加密的)、不可修改的(即签名)和URL – safe(即Base64编码的)。

JWT的定义:

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。

JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。

因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

JWT特点:

简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快

自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库

JWT构成

JWT主要包含三个部分之间用英语句号’.’隔开

Header 头部

Payload 负载

Signature 签名

注意,顺序是 header.payload.signature

JWT的负载(Payload)

负载(Payload)为JWT的第二部分。JWT的标准所定义了一下几个基本字段:

iss: 该JWT的签发者

sub: 该JWT的使用者

aud: 该JWT的接收者

exp(expires): Unix时间戳 过期时间

iat(issued at): Unix时间戳 签发时间

Java-Jwt中特别定义Payload

nbf(not before):Unix时间戳 生效时间

jti:JwtID JWT的唯一标识

kid: 返回KeyID

Jwt使用三部曲

添加依赖1

2

3

4

5

com.auth0

java-jwt

3.4.0

生成Jwt创建加密算法实例

HMAC256 表示加密算法 参数为加密密钥1Algorithm algorithm = Algorithm.HMAC256("securityKey");设置Jwt负载

通过withClaim 或 with 相应熟悉来设置头负载和负载1JWT.create().withClaim("key", "value")

签名

通过sign方法进行签名,需要传入加密算法实例1

2

3JWT.create().withClaim("key", "value").sign(algorithm);

JWT.create().withClaim("key", "value").sign(Algorithm.HMAC256("securityKey"));

校验Jwt创建加密算法实例

HMAC256 表示加密算法 参数为加密密钥1Algorithm algorithm = Algorithm.HMAC256("securityKey");创建校验器实例

通过传入加密算法实例来创建校验器实例1JWTVerifier jwtVerifier = JWT.require(algorithm).build();

在调用build()方法前可添加指定校验参数

如withSubject()方法,当sub属性值不为”user”时将抛出异常InvalidClaimException1JWTVerifier jwtVerifier = JWT.require(algorithm).withSubject("user").build();

需要特别注意关于调整校验签名时间的几个方法

acceptLeeway()、acceptExpiresAt()、acceptNotBefore()、acceptIssuedAt()参数为Long类型参数,且必须是正整数,表示调整时间(单位/秒)

acceptLeeway() nbf、iat 和 exp 延迟时间(单位/秒)

acceptExpiresAt() exp 延迟时间(单位/秒)

acceptNotBefore() nbf 延迟时间(单位/秒)

acceptIssuedAt() iat 延迟时间(单位/秒)校验签名

jwtVerifier.verify() 校验器实例方法返回解码后的结果

如果签名内容失效则会抛出SignatureVerificationException异常

当头部信息中包含iat、exp、nbf等属性时,verify()将自动进行校验。不包含的属性不进行校验。

如JWT时间失效,则会抛出TokenExpiredException异常

异常的父类为JWTVerificationException,可用于JWT失效处理。1

2

3DecodedJWT decodedJWT = jwtVerifier.verify("JWTString");

jwtVerifier.verify("JWTString");

解码Jwt

首先在调用校验方法时即可返回解码后类型为DecodedJWT的解码结果1DecodedJWT decodedJWT = jwtVerifier.verify("JWTString");

也可以使用decode()方法进行解码1DecodedJWT decodedJWT = JWT.decode(JwtResoult);

之后便可调用decodedJWT的get方法获取负载的相关内容

Claim (声明,断言的意思)中的asXXX()方法

asBoolean(): 返回 Boolean 值,如果不能转换则返回null。

asInt(): 返回 Int 值,如果不能转换则返回null。

asDouble(): 返回 Double 值,如果不能转换则返回null。

asLong(): 返回 Long 值,如果不能转换则返回null。

asString(): 返回 String值,如果不能转换则返回null。

asDate(): 返回 Date值,如果不能转换则返回null。 必须是一个数字日期 (Unix 系统时间戳)。

注意,JWT标准指定所有的数字日期值必须以秒为单位。

自定义类型和集合:

要获得作为集合的声明,您需要提供要转换的内容的类类型

as(class): 返回指定类型的对象。 对于集合,应该使用asArray和asList方法。

asMap(): 返回被转换为 Map 的集合

asArray(class): 返回被转换为 Class [] 的数组,如果转换失败则返回null。

asList(class): 返回被转换为 List的集合,如果转换失败则返回null。

由于Java-Jwt默认使用Jackson来处理负载中的Json。所以未进行配置的Jackson可能会由于转义字符的问题而产生下面的异常。

no String-argument constructor/factory method to deserialize from String value

解决办法是使用asString()转换为字符串再使用Json工具进行转换或者配置Jackson的以下配置

允许出现特殊字符和转义符:

configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);

允许出现单引号:

configure(Feature.ALLOW_SINGLE_QUOTES, true);

asarray java,Java相关推荐

  1. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

    MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...

  2. 零基础学JAVA]Java SE基础部分-01. Java发展及JDK配置

    1.课程名称:Java发展及JDK配置 本季介绍了JAVA的发展过程,包括JDK的发展历程,path路径的配置和classpath的配置及作用.并简单讲解了一个简单的JAVA程序,并通过此程序讲解了J ...

  3. Java - Java集合中的安全失败Fail Safe机制 (CopyOnWriteArrayList)

    文章目录 Pre 概述 fail-safe的容器-CopyOnWriteArrayList add remove函数 例子 缺陷 使用场景 Pre Java - Java集合中的快速失败Fail Fa ...

  4. Java - Java集合中的快速失败Fail Fast 机制

    文章目录 什么是 fail-fast 源码解读 Itr 为什么对集合的结构进行修改会发生并发修改异常-源码分析 修改方法之 remove 修改方法之 add 案例分享 [案例一] [案例二] [案例三 ...

  5. java比python难_python java JAVA比python难多少?

    python和java哪个好? 学python好还是java好一次一次的失望后来渐渐放弃,哪怕后来有人提起你的名字小编脸上也不会泛起红晕. Python Python是一种面向对象的解释型计算机程序设 ...

  6. [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件...

    问题1:怎样通过批处理调用java代码? 问题2:怎样通过java从CSV文件获取到用户名和密码存入变量? 问题3:怎样将获取到的用户名和密码组合成字符串,写入外部批处理文件? 问题4:怎样在批处理文 ...

  7. java java se_Java 8 SE可选,严格的方法

    java java se 大约两周前,Stephen Colebourne提出了使用Optional的实用方法 . 如果您阅读了它,您可能会从我以前的建议中猜到我不同意. 总览 我必须以免责声明开头, ...

  8. java java编码_Java编码约定被认为是有害的

    java java编码 在Oracle网站上有Java编程语言的官方代码约定指南. 您可能希望这份超过20页的文档将是有关Java语言的最佳实践,提示和技巧的最完整,最全面和最权威的来源. 但是一旦您 ...

  9. java java se_Java SE 11:推动Java前进

    java java se 介绍 在我看来,这篇文章提出了Java语言应该如何发展成为一种首选语言. 它还提供了一些我喜欢但是有时(可能永远不会)成为Java的一部分的功能,出于某些原因,我将对此加以解 ...

  10. java java se_Java SE 7、8、9 –推动Java前进

    java java se 今天(注:2011年10月4日)是主题演讲日. JavaOne Keynote将于今早从上午8:30到10:30进行,而我的新闻通行证又一次让我很早就参加了. 因此,我有时间 ...

最新文章

  1. python的if not用法
  2. 处理字符串_9_合并多行到一行
  3. mysql如何实现acid中的a_MySQL如何实现事务的ACID
  4. 文件行数_linux/unix下如何统计文件行数
  5. 我国数据中心产业发展“渐入佳境” 服务是重中之重
  6. Windows 2003 服务器安全设置-批处理 (附参考链接)
  7. bootstracp实现树形列表_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性...
  8. 全双工c语言程序,C语言面试题大汇总个人觉得还是比较全
  9. C++和C#的性能比较
  10. win10微软拼音输入法无提示怎么办?
  11. 【超图+CESIUM】【基础API使用示例】45、超图|CESIUM - 点光源设置
  12. “打印机安装失败,请检查打印服务”问题解决方案
  13. android TextView 异常换行问题
  14. 子线程与主线程之间的通信
  15. TTW WYSIWYG Editors
  16. linux驱动(一):linux驱动框架
  17. 使用ST-LINK下载遇到的连接错误
  18. unity产生阴影的几种方式
  19. 电子专业英语(持续更新)
  20. 2022年危险化学品经营单位主要负责人复训题库及模拟考试

热门文章

  1. 如何使PING命令带上日期,做长久的跟踪
  2. 手动建立规则方式创建stream环境
  3. git仓库迁移(全部分支)
  4. 企业级 SpringBoot 教程 (十)用spring Restdocs创建API文档
  5. 09、组策略之软件分发(05)
  6. Java 错误: 找不到或无法加载主类,问题集合
  7. oracle 修改数据表结构常用sql
  8. 2015级C++第10、11周程序阅读 继承和派生
  9. 3、ACE-实用生活口语---讲打电话Talking on the phone
  10. 解密联想20年的45条法则