前言
客户端要通过操作访问服务器,第一次登录后服务器会生成一个token(用户id,失效时间...),然后把token返回给客户端留存。以后的每一次操作都可以携带token到服务端去进行验证。如果验证成功,那么继续执行,如果验证失败,不让访问或者去做其他操作(再次登录)。
一、token的格式
JJWT(Java json web token)生成的token字符串格式如下:
{header}.{body}.{加密信息}
header:指定当前token使用的加密算法
body:明文的签名信息,然后做了base64编码(签名信息如用户标识 签发时间 有效期)
密文:对body按照header中指定的加密算法的结果,以及服务端保存的秘钥。进行加密后的字符串
二、使用步骤
1.JWTUtil工具类
代码如下(示例):
package com.java.tokenTest;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.Map;
public class JWTUtil {
//generateKey()生成的密钥
private static String key="phRWtrZEV8lYkXqfcfr/5tD8Y9aHDX7yxDLswV5y4WU=";
//设置有效期 ( 5分钟)
private static Long millData=5*60*1000L;
/**
* 生成密钥
* @return 返回生成的密钥
*/
public static String generateKey(){
// 按照指定的算法 生成符合该算法长度的秘钥 32字节
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
// 把生成的秘钥转换成字符串形式
String encode = Encoders.BASE64.encode(key.getEncoded());
return encode;
}
/**
* 使用密钥进行加密生成 Token
* @param map 明文
* @return token字符串
*/
public static String jwt(Map map){
//设置当前时间
Date currentDate = new Date();
//设置失效时间
Date expirationDate=new Date(currentDate.getTime()+millData);
//把字符串密钥 转换成 Key 类型
SecretKey secretKey = Keys.hmacShaKeyFor(Decoders.BASE64.decode(key));
// 使用以下方法进行加密,返回值就是根据秘钥加密后的字符串
String jwtStr = Jwts.builder().
setClaims(map).// 设置自定义签名 eg:用户id
setIssuedAt(currentDate).// 标准签名 生效时间
setExpiration(expirationDate).// 失效时间
signWith(secretKey).// 设置秘钥
compact();
return jwtStr;
}
/**
* 检验token
*/
public static Claims parse(String token){
Jws<Claims> claimsJws=null;
try {
claimsJws= Jwts.parserBuilder().
setSigningKey(key).//指定秘钥
build().parseClaimsJws(token);//解析token字符串
} catch (Exception e) {
e.printStackTrace();
}
return claimsJws.getBody();
}
}
2.测试代码如下(示例):
public class Test {
public static void main(String[] args) {
// Map<String, Object> map = new HashMap<>();
// map.put("name","wkx");
// map.put("sex","男");
// String jwt = JWTUtil.jwt(map);
// System.out.println("token密文:"+jwt);
// token密文:eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiLnlLciLCJuYW1lIjoid2t4IiwiaWF0IjoxNjUzMzk0OTUxLCJleHAiOjE2NTMzOTUyNTF9.wyn0vBfFf8NcEPWr4sh6qhLZRo0RD17rMigpbZcOn0M
Claims parse = JWTUtil.parse("eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiLnlLciLCJuYW1lIjoid2t4IiwiaWF0IjoxNjUzMzk0OTUxLCJleHAiOjE2NTMzOTUyNTF9.wyn0vBfFf8NcEPWr4sh6qhLZRo0RD17rMigpbZcOn0M");
System.out.println(parse.get("name"));//wkx
}
}
pom.xml中需要引入的依赖
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.1</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.1</version> <scope>runtime</scope> </dependency>
版权声明:本文为DW524245原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。