JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

JWT令牌生成及校验(jwt令牌组成)

wys521 2025-02-03 15:39:55 精选教程 21 ℃ 0 评论

1.先引入JWT的依赖

<!--JWT令牌-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

在引入完JWT来赖后,就可以调用工具包中提供的API来完成JWT令牌的生成和校验

2.生成JWT代码实现

/**
 * 生成JWT
 */
@Test
public void testGenJwt(){
    Map<String, Object> claims = new HashMap<>();
    claims.put("id",1);
    claims.put("name","tom");

    String jwt = Jwts.builder()
            .signWith(SignatureAlgorithm.HS256, "itheima")//签名算法
            .setClaims(claims) //自定义内容(载荷)
            .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
            .compact();
    System.out.println(jwt);
}

输出的结果就是生成的JWT令牌,,通过英文的点分割对三个部分进行分割,我们可以将生成的令牌复制 一下,然后打开JWT的官网,将生成的令牌直接放在Encoded位置,此时就会自动的将令牌解析出来。



3.实现了JWT令牌的生成,下面我们接着使用Java代码来校验JWT令牌(解析生成的令牌)

/**
 * 解析JWT
 */
@Test
public void testParseJwt(){
    Claims claims = Jwts.parser()
            .setSigningKey("itheima")
            .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY3MDQ2NDU0N30.yPLRyiusrlrmWeC4-dhInjFuAghPkmiHSRHd_DTKi9E")
            .getBody();
    System.out.println(claims);
}

4.登录下发令牌

JWT令牌的生成和校验的基本操作我们已经学习完了,接下来我们就需要在案例当中通过JWT令牌技术来 跟踪会话。具体的思路我们前面已经分析过了,主要就是两步操作:

实现步骤:

1. 引入JWT工具类 在项目工程下创建com.itheima.utils包,并把提供JWT工具类复制到该包下

package com.itheima.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "itheima";
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, 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)
                .getBody();
        return claims;
    }
}


2. 登录完成后,调用工具类生成JWT令牌并返回

package com.itheima.controller;

import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class LoginController {

    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp){
        log.info("员工登录: {}", emp);
        Emp e = empService.login(emp);

        //登录成功,生成令牌,下发令牌
        if (e != null){
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", e.getId());
            claims.put("name", e.getName());
            claims.put("username", e.getUsername());

            String jwt = JwtUtils.generateJwt(claims); //jwt包含了当前登录的员工信息
            return Result.success(jwt);
        }

        //登录失败, 返回错误信息
        return Result.error("用户名或密码错误");
    }

}


校验令牌 拦截前端请求,从请求中获取到令牌,对令牌进行解析校验

服务器响应的JWT令牌存储在本地浏览器哪里了呢? 在当前案例中,JWT令牌存储在浏览器的本地存储空间local storage中了。 local storage 是浏览器的本地存储,在移动端也是支持的。



我们在发起一个查询部门数据的请求,此时我们可以看到在请求头中包含一个token(JWT令牌),后续 的每一次请求当中,都会将这个令牌携带到服务端。


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表