襄阳网站排名优化,电脑网页怎么下载视频,创建网站商城,第一素材网一、介绍 JWT全称#xff1a;JSON Web Token 官网#xff1a;https://jwt.io/ 定义了一种简洁的、自包含的格式#xff0c;用于在通信双方以 json 数据格式安全的传输信息。由于数字签名的存在#xff0c;这些信息是可靠的 在生成 JWT 令牌时#xff0c;会对 JSON 格式的数…一、介绍 JWT全称JSON Web Token 官网https://jwt.io/ 定义了一种简洁的、自包含的格式用于在通信双方以 json 数据格式安全的传输信息。由于数字签名的存在这些信息是可靠的 在生成 JWT 令牌时会对 JSON 格式的数据进行一次编码进行 base64 编码 1、JWT 的组成
第一部分Header(头 记录令牌类型、签名算法等。 例如{“alg”:“HS256”,“type”:“JWT”}第二部分Payload(有效载荷携带一些自定义信息、默认信息等。 例如{“id”:“1”,“username”:“Tom”}第三部分Signature(签名防止 Token 被篡改、确保安全性。将 header、payload并加入指定秘钥通过指定签名算法计算而来
2、典型应用场景登录认证
在浏览器发起请求来执行登录操作此时会访问登录的接口如果登录成功之后我们需要生成一个 jwt 令牌一般包含用户的登录信息如 id 值将生成的 jwt 令牌返回给前端前端拿到 jwt 令牌之后会将 jwt 令牌存储起来。在后续的每一次请求中都会将 jwt 令牌携带到服务端服务端统一拦截请求之后先来判断一下这次请求有没有把令牌带过来如果没有带过来直接拒绝访问如果带过来了还要校验一下令牌是否是有效。如果有效就直接放行进行请求的处理
二、生成和解析
1、依赖引入
!-- JWT依赖--
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version
/dependency2、生成 JWT
代码实现
Test
public void genJwt(){MapString,Object claims new HashMap();claims.put(id,1);claims.put(username,Tom);String jwt Jwts.builder().setClaims(claims) //自定义内容(载荷) .signWith(SignatureAlgorithm.HS256, xtlhyl) //签名算法 .setExpiration(new Date(System.currentTimeMillis() 24*3600*1000)) //有效期 .compact();System.out.println(jwt);//输出如eyJhbGciOiJIUzI1NiJd.eyJpZCI6MSwiZXhwIjoxNjcyNzI5NzMwfQ.fHi0Ub8npbyt71UqLXDdLyipptLgxBUg_mSuGJtXtBk
}3、解析生成的令牌
Test
public void parseJwt(){Claims claims Jwts.parser().setSigningKey(xtlhyl)//指定签名密钥必须保证和生成令牌时使用相同的签名密钥 .parseClaimsJws(eyJhbGciOiJIUzI1NiJd.eyJpZCI6MSwiZXhwIjoxNjcyNzI5NzMwfQ.fHi0Ub8npbyt71UqLXDdLyipptLgxBUg_mSuGJtXtBk).getBody();System.out.println(claims);//输出{id1, exp1672729730}
}篡改令牌中的任何一个字符或者时间失效后再对令牌进行解析时都会报错 三、JWT 工具类
public class JwtUtils {private static String signKey itheima;//签名密钥private static Long expire 43200000L; //有效时间/*** 生成JWT令牌* param claims JWT第二部分负载 payload 中存储的内容* return*/public static String generateJwt(MapString, Object claims){String jwt Jwts.builder().addClaims(claims)//自定义信息有效载荷.signWith(SignatureAlgorithm.HS256, signKey)//签名算法头部.setExpiration(new Date(System.currentTimeMillis() expire))//过期时间.compact();return jwt;}/*** 解析JWT令牌* param jwt JWT令牌* return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims Jwts.parser().setSigningKey(signKey)//指定签名密钥.parseClaimsJws(jwt)//指定令牌Token.getBody();return claims;}
}