JWT令牌的作用和生成

JWT令牌(JSON Web Token)是一种用于身份验证和授权的安全令牌。它由三部分组成:头部、载荷和签名。

JWT令牌的作用如下:

  1. 身份验证:JWT令牌可以验证用户身份。当用户登录后,服务器会生成一个JWT令牌并返回给客户端,客户端在后续的请求中携带这个JWT令牌作为身份验证凭证。服务器可以根据JWT令牌验证用户的身份和权限。
  2. 信息传递:JWT令牌可以携带一些用户的相关信息,如用户ID、用户名等。这些信息可以在令牌中进行加密并传递给服务器,服务器可以解析令牌获取用户信息。
  3. 授权:JWT令牌可以用于授权访问。服务器可以根据JWT令牌中的信息判断用户是否有权限访问某些资源或执行某些操作。

JWT令牌有以下优点:

  1. 无状态:服务器不需要存储用户的会话信息,每个请求都包含了认证和授权的信息,因此可以在多个服务器之间共享用户的认证信息。
  2. 可扩展性:JWT令牌可以包含任意的信息,可以根据需要自定义载荷中的字段。
  3. 安全性:JWT令牌使用签名机制对令牌进行验证和防篡改。服务器可以使用密钥对令牌进行签名,客户端在接收到令牌时可以进行验证签名,确保令牌的合法性。
  4. 简单性:JWT令牌的结构简单,使用方便,可以在不同的编程语言和平台进行使用。

 生成:

先要添加jwt的依赖:

 然后使用下面代码就行了:

 解析令牌信息:

### JWT令牌生成 为了生成JWT令牌,可以采用多种方式。一种常见的方式是利用Java中的`Jwts.builder()`方法构建并创建带有签名的JSON Web Token (JWT)[^1]。 ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @Test public void createJwt() { String secretKey = "chengxuyuanchengxuyuanchengxuyuanchengxuyuanchengxuyuan"; String compactJws = Jwts.builder() .setSubject("KBLL") .claim("id", 1) .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) .compact(); System.out.println(compactJws); } ``` 这段代码展示了如何设置主题(`subject`)以及自定义声明(`claims`),并通过指定算法(HMAC SHA-256) 密钥对消息进行签名。 ### 使用Hutool库简化操作 除了上述标准做法外,还可以借助第三方库如Hutool来更便捷地完成相同的工作。该库提供了专门用于处理JWT的功能——`JWTUtil`工具类[^2]: ```java import cn.hutool.extra.jwt.JWT; import cn.hutool.extra.jwt.JWTUtil; @Test public void generateTokenUsingHutool(){ Map<String,Object> payload = new HashMap<>(); payload.put("id", 1); payload.put("username","KBLL"); String token = JWTUtil.createToken(payload,"secret".getBytes()); System.out.println(token); } ``` 这里使用了更加简洁的方式来创建包含有效负载信息的JWT字符串,并指定了加密所需的字节数组形式的秘密钥匙。 ### 解析JWT令牌 对于解析已有的JWT令牌而言,在确保拥有正确的验证密钥前提下,可以通过如下方式进行解码与校验: #### Java自带API实现 当尝试读取由其他服务端签发且可能已经失效或被修改过的JWT时,应该将其包裹在一个异常处理器内以应对潜在错误状况: ```java import java.util.Date; import javax.crypto.spec.SecretKeySpec; import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.Jwts; import org.junit.Test; @Test public void parseJwt() throws Exception{ try { Claims claims = Jwts.parserBuilder() .setSigningKey("chengxuyuanchengxuyuanchengxuyuanchengxuyuanchengxuyuan".getBytes()) // 指定签名密钥 .build() .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJLQkwiLCJleHAiOjE3Mjc3NzkxNTR9.7Nt1IbfAZ52PKW5cjjbjr3oND9iaJxvGFO5w5g3uNV8").getBody(); Date expirationTime = claims.getExpiration(); boolean isValid = !new Date().after(expirationTime); System.out.println("Is Valid:" + isValid); System.out.println(claims); } catch (ExpiredJwtException e){ System.err.println("The provided JWT has expired."); } } ``` 此部分代码不仅实现了基本的身份验证逻辑,还加入了针对过期事件的具体捕捉机制。 #### Hutool库实现 同样地,如果选择了Hutool作为辅助开发工具,则可参照下面的例子来进行相应的解析工作: ```java import cn.hutool.extra.jwt.JWTValidator; import cn.hutool.extra.jwt.JWT; import cn.hutool.extra.jwt.exceptions.JWTValidationException; @Test public void verifyAndParseByHutool()throws JWTValidationException{ JWT jwt = JWT.of("your_jwt_string_here"); jwt.setKey("secret_key_as_bytes".getBytes()); if(jwt.validate()){ System.out.println(jwt.getPayloads()); }else{ throw new JWTValidationException("Invalid signature or other issues occurred during validation."); } } ``` 这种方法能够有效地减少编码量的同时保持良好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个为生活奋斗的青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值