JWT(Json Web Token)是实现token技术的一种解决方案,JWT由三部分组成: header(头)payload(载体)signature(签名)

JWT第一部分是header,header主要包含两个部分,alg指加密类型,可选值为HS256RSA等等,typ=JWT为固定值,表示token的类型。。

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

载体

JWT第二部分是payload,payload是token的详细内容,一般包括iss (发行者), exp (过期时间), sub(用户信息), aud (接收者),以及其他信息,详细介绍请参考官网,也可以包含自定义字段。

{"iat": 1493090001,"name": "张三"
}
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID

签名

JWT第二部分是signature,这部分的内容是这样计算得来的:

Base64(header).Base64(payload)得到一个Base64编码的字符串(下文成EncodeString)
HS256(EncodeString,"秘钥");计算得到的即使签名。
计算得到上面三部分内容后,用.连接起来就是一个完整的 JWT TOKEN,秘钥是保存在服务器上的一个私有密钥。

将头部、声明、签名用.号连在一起就得到了我们要的JWT。

eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTUyOTgxNDEsImtleSI6InZhdWxlIn0.orewTmil7YmIXKILHwFnw3Bq1Ox4maXEzp0NC5LRaFQ

和Session方式存储id的差异

Session方式存储用户id的最大弊病在于要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。

而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如用户角色,用户性别等。

java 使用 jwt

引入jar

<!--JWT-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version>
</dependency>

demo

package user;import io.jsonwebtoken.*;
import org.joda.time.DateTime;
import org.junit.Test;import java.util.Date;public class JWT {private static final String PRIVATE_KEY = "123456789";@Testpublic void jwtTest() throws InterruptedException {// 设置3秒后过期String jwt = this.buildJwt(DateTime.now().plusSeconds(3).toDate());System.out.println(jwt);// 验证token是否可用boolean isOk = this.isJwtValid(jwt);System.out.println(isOk);}public String buildJwt(Date exp) {String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)//SECRET_KEY是加密算法对应的密钥,这里使用额是HS256加密算法.setExpiration(exp)//expTime是过期时间.claim("key", "vaule")//该方法是在JWT中加入值为vaule的key字段.compact();return jwt;}public boolean isJwtValid(String jwt) {try {//解析JWT字符串中的数据,并进行最基础的验证Claims claims = Jwts.parser().setSigningKey(PRIVATE_KEY)//SECRET_KEY是加密算法对应的密钥,jjwt可以自动判断机密算法.parseClaimsJws(jwt)//jwt是JWT字符串.getBody();String vaule = claims.get("key", String.class);//获取自定义字段key//判断自定义字段是否正确if ("vaule".equals(vaule)) {return true;} else {return false;}}//在解析JWT字符串时,如果密钥不正确,将会解析失败,抛出SignatureException异常,说明该JWT字符串是伪造的//在解析JWT字符串时,如果‘过期时间字段’已经早于当前时间,将会抛出ExpiredJwtException异常,说明本次请求已经失效catch (SignatureException | ExpiredJwtException e) {return false;}}
}

JWT (Json Web Token)教程相关推荐

  1. JWT(JSON Web Token)简介及实现

    JWT(JSON Web Token):是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为Json对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信 ...

  2. JWT(JSON web token)

    1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contain ...

  3. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  4. jwt token 过期刷新_如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  5. 关于JWT(Json Web Token)的思考及使用心得 1

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(https://tools.ietf.org/html/r...,一般用来做轻量级的API鉴权.由于许 ...

  6. sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  7. 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  8. 登录令牌JWT — JSON WEB TOKEN

    登录令牌JWT - JSON WEB TOKEN 关于作者 作者介绍

  9. 在吗?认识一下JWT(JSON Web Token) ?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:是虎子呀  地址:my.oschina.net/u/4062 ...

最新文章

  1. python opencv 视频剪辑
  2. 大学python实训总结-【实训总结】大学生python相关实训总结
  3. 《化工原理》课程设计说明书
  4. msf如何升级_Kali linux 2016.2(Rolling)中的Metasploit如何更新与目录结构初步认识...
  5. oracle序列修改语句
  6. selenium+python设置爬虫代理IP的方法
  7. TempData[a]多个Action方法之前共享数据
  8. 用深度优先搜索解决最长路径问题
  9. 计算机控制系统中的Z变换
  10. CGAL点云重建白膜
  11. python实现syn半扫描_python 实现 syn 扫描
  12. 汽车维修企业管理【15】
  13. 雨点效果——HTML5之特效
  14. mysql gone away的几种原因
  15. linux 内核通知,[Linux] 内核通知链 notifier
  16. Electron打包方式
  17. Python学习记录(4)元组:戴了紧箍咒的列表
  18. 考公历程 #1 学习笔记
  19. 基于matlab的相干信号的doa 估计,基于空间平滑MUSIC算法的相干信号DOA估计(1)
  20. mysql查询2开头的_MySQL-2.查询

热门文章

  1. QT乱码总结5.万能解决方案
  2. 1_1 FactoryMode 工厂模式
  3. 简单的WinInet编程
  4. 关于寻路算法的一些思考(2):Heuristics 函数
  5. 让程序在崩溃时体面的退出之SEH
  6. PyCairo 中的透明度
  7. ElasticSearch探索之路(六)实战:环境搭建、REST、CRUD、Search
  8. Python中变量的作用域?(变量查找顺序)
  9. 【线上分享】视频直播与远程会议中的AI关键技术应用及创新
  10. VirtualBox 释放虚拟磁盘文件的大小