本片文章是学习B站黑马程序员苍穹外卖的学习笔记。在Day01(如果学到登录界面这里卡住了,可以看看这篇文章),登陆界面的后端实现大致可以分为两部分登录功能和登录校验,其中登陆校验的实现是基于令牌JWT技术来实现会话追踪(校验部分还有拦截器Interceptor这个我没太学懂视频也没提,以后在更)
JWT是一种在Web应用程序,简单且安全地处理用户身份验证和信息交换的技术,首先我们应该了解JWT的组成才能用代码实现它。
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