JAVA结合 JSON Web Token(JWT) 工具类
引入java-jwt-3.3.0.jar 、 jjwt-0.9.0.jar 、jackson-all-1.7.6.jar
或者maven
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.3.0</version>
</dependency> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.7.0</version>
</dependency>
JWTUtils.java
import io.jsonwebtoken.*;
import org.codehaus.jackson.map.ObjectMapper; import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map; /**
* @author yvioo。
*/ public class JWTUtils { /**
* 服务器的kye.用户做加解密的key数据。
*/
private static final String JWT_SECERT = "23asfeferfggrtg"; private static final ObjectMapper MAPPER = new ObjectMapper(); public static SecretKey generalKey() {
try {
byte[] encodedKey = JWT_SECERT.getBytes("UTF-8");
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 签发JWT,创建token的方法
*
* @param id jwt的唯一标识,主要用来做一次性token。
* @param iss jwt签发者
* @param subject jwt所面向的用户。一般使用用户的登录名
* @param headerMap 请求头map集合
* @param ttlMillis 有效期,单位毫秒
* @return token 是为一个用户的有效登录周期准备的一个token 。用户退出或超时,token失效
*/
public static String createJWT(String id, String iss, String subject, Map<String, Object> headerMap, long ttlMillis) {
try {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMilllis = System.currentTimeMillis();
Date now = new Date(nowMilllis);
SecretKey secretKey = generalKey();
JwtBuilder builder = Jwts.builder()
.setId(id)
.setIssuer(iss)
.setSubject(subject)
//token生成时间
.setIssuedAt(now)
//设置密匙和算法
.signWith(signatureAlgorithm, secretKey);
if (headerMap != null) {
builder.setHeaderParams(headerMap);
}
if (ttlMillis > 0) {
long expMillis = nowMilllis + ttlMillis;
Date expDate = new Date(expMillis);
builder.setExpiration(expDate);
}
return builder.compact();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 解析JWT字符串
*
* @param jwt 就是生成的toekn
* @return
*/
public static Claims parseJWT(String jwt) {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
} /**
* 解析JWT请求头字符串
* @param jwt 就是生成的toekn
* @return
*/
public static JwsHeader parseJwsHeader(String jwt) {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getHeader();
} /**
* 验证jwt
*
* @param jwtStr
* @return
*/
public static boolean validateJWT(String jwtStr) {
Claims claims = null;
try {
claims = parseJWT(jwtStr);
return true;
//成功
} catch (ExpiredJwtException e) {
//token过期
return false;
} catch (Exception e) {
return false;
}
} public static String generalSubject(Object subject) {
try {
return MAPPER.writeValueAsString(subject);
} catch (Exception e) {
e.printStackTrace();
}
return subject + "";
} public static void main(String[] args) {
Map<String, Object> param = new LinkedHashMap<>();
param.put("code", "1222");
String jwtToken = JWTUtils.createJWT("1", "test-jwt", JWTUtils.generalSubject("yvioo"), param, 1 * 60 * 1000);
System.out.println(jwtToken);
Claims claims = parseJWT(jwtToken);
System.out.println(claims.getId());
JwsHeader jwsHeader = parseJwsHeader(jwtToken);
System.out.println(jwsHeader.get("code")); } /**
* 获取接口放在header中的token
*
* @param request
*/
public void test(HttpServletRequest request) {
//生成的token
String token = request.getHeader("Authorization");
//验证
boolean result = JWTUtils.validateJWT(token);
} }
JAVA结合 JSON Web Token(JWT) 工具类的更多相关文章
- JSON Web Token (JWT),服务端信息传输安全解决方案。
JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...
- JSON WEB Token(JWT)
最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...
- JSON Web Token (JWT) 简介
JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...
- JSON Web Token (JWT) 实现与使用方法
1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...
- Json Web Token(JWT)详解
什么是Json Web Token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...
- 漫谈JSON Web Token(JWT)
一.背景 传统的单体应用基于cookie-session的身份验证流程一般是这样的: 用户向服务器发送账户和密码. 服务器验证账号密码成功后,相关数据(用户角色.登录时间等)都保存到当前会话中. 服务 ...
- 基于 Token 的身份验证:JSON Web Token(JWT)
1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...
- JSON Web Token (JWT) - Introduction
To validate the challenge, connect as admin.------------以admin登陆 https://jwt.io/introduction/ ...
- JSON Web Token (JWT)生成Token及解密实战。
昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...
随机推荐
- Codeforces 1365G - Secure Password(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 首先考虑一个询问 \(20\) 次的方案,考虑每一位,一遍询问求出下标的这一位上为 \(0\) 的位置上值的 bitwise or,再一遍 ...
- 洛谷 P2481 [SDOI2010]代码拍卖会(背包+隔板法)
题面传送门 题意: 给出 \(n,p\),求有多少 \(n\) 位数 \(X=a_1a_2a_3\dots a_n\) 满足: 该 \(n\) 位数不含前导零 \(a_i \leq a_{i+1}\) ...
- Codeforces 1010F - Tree(分治 NTT+树剖)
Codeforces 题面传送门 & 洛谷题面传送门 神仙题. 首先我们考虑按照这题的套路,记 \(t_i\) 表示 \(i\) 上的果子数量减去其儿子果子数量之和,那么对于一个合法的放置果子 ...
- BZOJ 3926 诸神眷顾的幻想乡
BZOJ 3926 诸神眷顾的幻想乡 开始看错题看成了每个点度数不超过20 后来翻了翻题解原来看错题的不止我一个 既然叶子数量不超过20,考虑树上的任何一条路径,以任何点为根时,如果它不是一条从上到下 ...
- Synteny和collinear的区别
在比较基因组学的时候,经常会听到"共线性"这个词,但是与其对应的有两个不同的概念,即 (1) synteny (2) collinear 二者的区别如下图所示: 可以看到,synt ...
- python15正则表达式
------------恢复内容开始------------ python实现实现实现实现 import re #将表达式编译,返回一个对象, pattern = re.compile(r" ...
- 深度探讨 PHP 之性能
1.缘起 关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言,库类丰富,使用简单,安全,非常适合WEB开发,但性能低下.PHP的性能是否真的就 如同大家的感觉一样的差呢?本文就是围绕这么一个话题 ...
- Identity Server 4 从入门到落地(四)—— 创建Web Api
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Shell 指定行处理head、tail、sed
目录 Shell 指定行处理 head.tail.sed head 前几行 tail sed 删除.替换.新增.选取 案例 删除行 插入行 查看某行 替换某行 部分数据的查找并替换 读写操作 Shel ...
- 生产调优2 HDFS-集群压测
目录 2 HDFS-集群压测 2.1 测试HDFS写性能 测试1 限制网络 1 向HDFS集群写10个128M的文件 测试结果分析 测试2 不限制网络 1 向HDFS集群写10个128M的文件 2 测 ...