Json web token (JWT),是用于对应用程序上的用户进行身份验证的标记,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、流程- 用户使用用户名密码来请求服务器
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个token
- 客户端存储token,并在每次请求时附送上这个token值
- 服务端验证token值,并返回数据
JWT是由三段信息构成的,将这三段信息文本用.连接一起就构成了Jwt字符串。官网:https://jwt.io。
HEADER:由JWT头部信息header加密得到
PAYLOAD:由JWT用到的身份验证信息json数据加密得到
SIGNATURE:由HEADER和PAYLOAD加密得到,是校验部分
四、示例导入依赖:
io.jsonwebtoken jjwt0.9.1
编写测试用例:
1、生成 token
@Test
public void generJwtTest(){
//1.先定义数据
HashMap map = new HashMap();
map.put("userId",String.valueOf(1));
map.put("phone","13647628330");
map.put("name","张三");
long now = System.currentTimeMillis();
//2.创建生成jwt--三部分,使用JWT的工具类生成token
String token = Jwts.builder()
//2.1 jwt 的 header 部分的加密算法 和 第三部分 自定义的 字符串
.signWith(SignatureAlgorithm.HS256,"tanqi")
//2.2 写入数据
.setClaims(map)
//2.3 失效时间
.setExpiration(new Date(now + 300000))
.compact();
System.out.println(token);
}
测试结果:
eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjEzNjQ3NjI4MzMwIiwibmFtZSI6IuW8oOS4iSIsImV4cCI6MTY1ODgzMzQwNiwidXNlcklkIjoiMSJ9.50wgzoY3DKw1UCDJwofoVbzvXjAophGlpWjQRQNxsi4
2、解析token
@Test
public void parseJwtTest(){
String token = "eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjEzNjQ3NjI4MzMwIiwibmFtZSI6IuW8oOS4iSIsImV4cCI6MTY1ODgzMzQwNiwidXNlcklkIjoiMSJ9.50wgzoY3DKw1UCDJwofoVbzvXjAophGlpWjQRQNxsi4";
try {
Claims claims = Jwts.parser()
.setSigningKey("tanqi")
.parseClaimsJws(token)
.getBody();
//获取解析后的数据并打印
String userId = (String) claims.get("userId");
String phone = (String) claims.get("phone");
String name = (String) claims.get("name");
System.out.println(userId);
System.out.println(name);
System.out.println(phone);
}catch (ExpiredJwtException e){
System.out.println("token已过期");
}catch (SignatureException e){
System.out.println("token不合法");
}
}
测试结果:
1 张三 13647628330



