JavaWeb(苍穹外卖)--学习笔记03(登录生成令牌)

前言

本片文章是学习B站黑马程序员苍穹外卖的学习笔记。在Day01(如果学到登录界面这里卡住了,可以看看这篇文章),登陆界面的后端实现大致可以分为两部分登录功能和登录校验,其中登陆校验的实现是基于令牌JWT技术来实现会话追踪(校验部分还有拦截器Interceptor这个我没太学懂视频也没提,以后在更)

JWT令牌基本概念

JWT是一种在Web应用程序,简单且安全地处理用户身份验证和信息交换的技术,首先我们应该了解JWT的组成才能用代码实现它。

JWT令牌由三个部分组成:

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{“alg”:“HS256”,“type”:“JWT”}
  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{“id”:“1”,“username”:“Tom”}
  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

JWT令牌实现

接下来我们来看总的代码:


        //登录成功后,生成jwt令牌
        Map<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
        String token = JwtUtil.createJWT(
                jwtProperties.getAdminSecretKey(),
                jwtProperties.getAdminTtl(),
                claims);

我用AI给它注释了一下,可以更清楚地看到生成各部分的内容

// 登录成功后,生成 JWT 令牌

// Step 1: 构建 Payload(有效载荷),也就是我们常说的 Claims(声明)
Map<String, Object> claims = new HashMap<>();

// 将员工ID放入claims中,作为用户身份的一部分
// JwtClaimsConstant.EMP_ID 是自定义的键名,例如 "empId"
claims.put(JwtClaimsConstant.EMP_ID, employee.getId());

// Step 2: 调用工具类生成 JWT 令牌
String token = JwtUtil.createJWT(
        jwtProperties.getAdminSecretKey(), // 签名使用的密钥(用于生成和验证签名)
        jwtProperties.getAdminTtl(),        // 令牌有效期(单位通常是毫秒)
        claims                              // 自定义的 payload 数据(即上面构造的 claims)
);

其中还有两个内容(比较难理解):


   1. JwtClaimsConstant.EMP_ID
   
   2. @Autowired
    private JwtProperties jwtProperties;

我们来看一下它来自哪个类,理解他们的作用:

1.JwtClaimsConstant.EMP_ID 是自定义的键名
它对应ID这个值,这里创建一个专门的类来存放 JWT 所需的各种 claim 键名:

package com.sky.constant;

public class JwtClaimsConstant {

    public static final String EMP_ID = "empId";
    public static final String USER_ID = "userId";
    public static final String PHONE = "phone";
    public static final String USERNAME = "username";
    public static final String NAME = "name";

}

这个类只是一个 常量类,它的作用是统一管理 JWT 中使用的各种字段名称,避免硬编码和拼写错误。

所以claims.put(JwtClaimsConstant.EMP_ID, employee.getId()); 等价于 claims.put(“empId”, employee.getId());

2. @Autowired
private JwtProperties jwtProperties;

我们来看看它对应的类

@Component
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {

    /**
     * 管理端员工生成jwt令牌相关配置
     */
    private String adminSecretKey;
    private long adminTtl;
    private String adminTokenName;

    /**
     * 用户端微信用户生成jwt令牌相关配置
     */
    private String userSecretKey;
    private long userTtl;
    private String userTokenName;

}

这里(@ConfigurationProperties(prefix = “sky.jwt”))用到了Spring Boot 提供的一个注解(用于 将配置文件中以指定前缀开头的一组属性自动绑定(映射)到一个 Java Bean 对象的字段上。),我们来看看其丢应的application.yml 文件

sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 7200000
    # 设置前端传递过来的令牌名称
    admin-token-name: token

Spring Boot 会自动把这些配置值注入到 JwtProperties 类的相应字段中

admin-secret-key--->adminSecretKey
admin-ttl--->adminTtl
token--->adminTokenName

你可能感兴趣的:(JavaWeb(苍穹外卖),学习,笔记,java)