刚学会了点使用Jwt来验证登录,记录下来
参考
JSON Web Tokens官网 Libraries里有各种语言的推荐包
jjwt的Github网址 JWT官网里面star最多的,所以用了
jjwt官方 生成和解析的例子
前后端分离之JWT用户认证 对JWT有详细的介绍
Java安全验证之JWT实践
依赖
当时在maven仓库里找到的最新版 网盘
Maven仓库 可以自己找最新的
流程
- 登录成功后,在Java中生成Jwt,存入数据库,然后返回给前端;前端接收到Jwt,储存起来(cookie或localStorage)。
- 前端调用api时放在Header的Authorization里面,后端通过过滤器Filter判断是否已登录。
没有使用框架,单纯的Html、servlet、数据库
生成和解析Jwt
其实就是官方的 然后用谷歌翻译了一波
生成jwt
//构建JWT的示例方法
private String createJWT(String id, String issuer, String subject, long ttlMillis) {
//我们将用于签署令牌的JWT签名算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//创建时间
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
//我们将使用我们的Api Key秘密签署您的JWT
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
//让我们设置JWT Claims
JwtBuilder builder = Jwts.builder().setId(id)
.setIssuedAt(now)
.setSubject(subject)
.setIssuer(issuer)
.signWith(signatureAlgorithm, signingKey);
//builder.claim("name", "value"); //设置自定义的信息
//如果已经指定,让我们添加到期日
//过期时间
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
//构建JWT并将其序列化为紧凑的URL安全字符串
return builder.compact();
}
解析Jwt
//验证和读取JWT的示例方法
private void parseJWT(String jwt) {
//如果它不是签名的JWS(如预期的那样),则该行将抛出异常
Claims claims = Jwts.parser()
.setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))
.parseClaimsJws(jwt).getBody();
System.out.println("ID: " + claims.getId());
System.out.println("Subject: " + claims.getSubject());
System.out.println("Issuer: " + claims.getIssuer());
System.out.println("Expiration: " + claims.getExpiration());
//claims.get("name") //获取自定义的信息
}
实例
后端
JwtUtil 工具类
package com.util