SpringBoot-JWT生成

发布于:2023-09-21 ⋅ 阅读:(62) ⋅ 点赞:(0)

 一、理论

1.配置pom.xml

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

2.加密方式

 说明:官网JSON Web Tokens - jwt.io

3. 测试类

说明:使用Jwts.builder()方法创建一个JWT实例,设置签名算法为HS256,自定义内容(载荷)为一个包含id和name属性的Map对象,设置有效期为一个小时(3600秒),最后通过compact()方法生成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,"forever") //设置签名算法
                .setClaims(claims) //自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis()+3600*1000)) //设置有效期为一个小时
                .compact();
        System.out.println(jwt);
    }
}

4. 官网解码

5.解码方法

说明:使用Jwts.parser()方法创建一个JWT解析器实例,指定签名秘钥为"forever",然后调用parseClaimsJws()方法解析JWT字符串,最后获取解析出的Claims对象并输出。

    //JWT解析
    @Test
    public void testParseJwt() {
        Claims claims = Jwts.parser()
                .setSigningKey("forever")  //指定签名秘钥
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5NTE5MzIxM30.EZ3aIpgt3-FRu0BI3F2ZjVm2yLvF7wHQmFV2KhC5nIc") //解析令牌
                .getBody();
        System.out.println(claims);
    }
}

二、实战

1. JwtUtils类

说明:书写JwtUtils类

package com.itheima.controller.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 = "forever";
    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.LoginController

说明:登录控制类

package com.itheima.controller;

import com.itheima.controller.utils.JwtUtils;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
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.getName());
            String jwt = JwtUtils.generateJwt(claims);  //包含员工登录的信息
            return Result.success(jwt);
        }
//        登录失败,返回错误信息
        return Result.error("用户名或者密码错误");
    }
}

3.测试


网站公告

今日签到

点亮在社区的每一天
去签到