JWT/JJWT JSON WEB TOKEN介绍和使用

JSON web Token,简称JWT,本质是一个token,是一种紧凑的URL安全方法(注意是方法,博主刚开始接触一直以为是一种像shiro一样的),用于在网络通信的双方之间传递。一般放在HTTP的headers 参数里面的authorization里面(这个是可以自己定义放在哪里的,毕竟只是一种验证用户的方式),值的前面加Bearer关键字和空格。除此之外,也可以在url和request body中传递。
JWT包含三个部分,分别是头部、载荷与签名。其中头部包含的是加密的一些信息,签名是根据前面两部分生成的。最主要的就是咱们存放信息的载荷部分了。
具体介绍可以参考:http://blog.leapoahead.com/2015/09/06/understanding-jwt/
这里就不再赘述,这篇文章主要说jjwt的使用,也就是java版本的jwt包的使用
maven:
当然,项目中没有maven的同学也可以去maven仓库里下载jjwt的jar包引入项目

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

快速开始:
构造jwt串

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.crypto.MacProvider;
import java.security.Key;

// We need a signing key, so we'll create one just for this example. Usually
// the key would be read from your application configuration instead.

Key key = MacProvider.generateKey();//这里是加密解密的key。

String compactJws = Jwts.builder()//返回的字符串便是我们的jwt串了
  .setSubject("Joe")//设置主题
  .signWith(SignatureAlgorithm.HS512, key)//设置算法(必须)
  .compact();//这个是全部设置完成后拼成jwt串的方法

大概会是这样:

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJKb2UifQ.yiV1GWDrQyCeoOswYTf_xvlgsnaVVYJM0mU6rkmRBf2T1MBl3Xh2kZii0Q9BdX5-G0j25Qv2WF4lA6jPl5GKuA

解析jwt串:

Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws).getBody().getSubject(); // 获取jwt串里的subject参数,获取body以后可以获取到你存入的信息

其中parseClaimsJws验证jwt字符串失败可能会抛出异常,这时咱们应该捕获这个异常:

try {

    Jws<Claims> parseClaimsJws = Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);//compactJws为jwt字符串
    Claims body = parseClaimsJws.getBody();//得到body后我们可以从body中获取我们需要的信息
    //比如 获取主题,当然,这是我们在生成jwt字符串的时候就已经存进来的
    String subject = body.getSubject();


    //OK, we can trust this JWT

} catch (SignatureException | MalformedJwtException e) {
            // TODO: handle exception
            // don't trust the JWT!
            // jwt 解析错误
        } catch (ExpiredJwtException e) {
            // TODO: handle exception
            // jwt 已经过期,在设置jwt的时候如果设置了过期时间,这里会自动判断jwt是否已经过期,如果过期则会抛出这个异常,我们可以抓住这个异常并作相关处理。
        }

ok,如果还有不明白的地方可以参考jjwt在github上的readme:https://github.com/jwtk/jjwt

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
使用 JSON Web Token (JWT) 实现登录的 Java 代码如下: 首先,需要引入以下依赖: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> ``` 然后,可以编写一个 `JwtUtil` 类来实现 JWT 的生成和解析: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import java.security.Key; import java.util.Date; public class JwtUtil { private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); public static String generateToken(String subject, long expirationTimeMillis) { Date now = new Date(); Date expirationDate = new Date(now.getTime() + expirationTimeMillis); return Jwts.builder() .setSubject(subject) .setIssuedAt(now) .setExpiration(expirationDate) .signWith(key) .compact(); } public static String parseToken(String token) { Claims claims = Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(token) .getBody(); return claims.getSubject(); } } ``` 在上面的代码中,`generateToken` 方法用于生成 JWT,接受一个 `subject` 参数表示用户 ID,和一个 `expirationTimeMillis` 参数表示过期时间(以毫秒为单位)。`parseToken` 方法用于解析 JWT,返回其中的用户 ID。 接下来,可以编写一个简单的登录接口: ```java import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class LoginController { @PostMapping("/login") public ResponseEntity<String> login(@RequestBody User user) { if (authenticate(user)) { String token = JwtUtil.generateToken(user.getId(), 86400000); return ResponseEntity.ok(token); } else { return ResponseEntity.badRequest().build(); } } private boolean authenticate(User user) { // TODO: 实现验证逻辑 return true; } } ``` 在上面的代码中,`User` 是一个简单的 Java 类,包含一个字符串类型的 `id` 属性。`login` 方法接受一个 `User` 对象作为参数,调用 `authenticate` 方法进行验证。如果验证通过,则使用 `JwtUtil.generateToken` 方法生成 JWT 并返回;否则返回错误响应。 最后,可以编写一个使用 JWT 进行身份验证的接口: ```java import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @GetMapping("/user") public ResponseEntity<String> getUser(@RequestHeader("Authorization") String authorizationHeader) { String token = authorizationHeader.substring(7); String userId = JwtUtil.parseToken(token); // TODO: 根据用户 ID 查询用户信息并返回 return ResponseEntity.ok("User ID: " + userId); } } ``` 在上面的代码中,`getUser` 方法接受一个名为 `Authorization` 的请求头,其中包含 JWT。首先从请求头中获取 JWT,并调用 `JwtUtil.parseToken` 方法解析其中的用户 ID。然后根据用户 ID 查询用户信息并返回。 注意,在实际应用中,需要对 JWT 进行安全性考虑,比如使用 HTTPS 协议传输、设置较短的过期时间、使用更复杂的密钥等。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值