一、Redis 登录优化(核心:令牌主动失效)
作用
解决 JWT 无法主动作废的问题:
- 修改密码
- 退出登录
- 强制下线
都能让 token 立刻失效,提高系统安全性。
二、登录时保存 token 到 Redis(正确写法)
java
运行
// 获取 Redis 字符串操作对象
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
// 存入 token,有效期 12 小时(和 JWT 保持一致)
operations.set(token, token, 12, TimeUnit.HOURS);
重点说明
ValueOperations是 Redis 字符串类型操作器- 将 token 作为 key 和 value 一起存
- 过期时间 ≥ JWT 过期时间
三、拦截器校验 Redis 是否存在(你的正确代码)
java
运行
// 获取 Redis 操作对象
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
// 根据 token 获取 Redis 中的值
String tokenValue = operations.get(token);
// 如果为 null,说明 token 已失效/不存在
if (tokenValue == null) {
throw new RuntimeException("token 不存在或已失效");
}
重点
- 通过
get(token)判断是否有效 - 为 null → 验证失败
- 不会像 hasKey 那样返回包装类,更安全、更直观
四、修改密码 / 退出登录 → 删除 token(你的正确代码)
java
运行
// 获取 Redis 操作对象
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
// 删除 token(让旧token立刻失效)
operations.getOperations().delete(token);
重点
operations.getOperations()→ 获取 Redis 连接对象- 调用
.delete(token)→ 立即删除 - 删除后,旧 token 再也无法登录
五、完整 LoginInterceptor 正确代码
java
运行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 获取请求头中的 token
String token = request.getHeader("Authorization");
try {
// 2. 校验 JWT 合法性
Map<String, Object> claims = JwtUtil.parseToken(token);
// ======================
// Redis 校验(你的正确写法)
// ======================
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
String tokenValue = operations.get(token);
// 如果Redis中没有这个token,拒绝访问
if (tokenValue == null) {
response.setStatus(401);
return false;
}
// 3. 存入 ThreadLocal
ThreadLocalUtil.set(claims);
return true;
} catch (Exception e) {
response.setStatus(401);
return false;
}
}
六、修改密码时删除 Redis Token(你的正确写法)
java
运行
@PatchMapping("/updatePwd")
public Result updatePwd(@RequestBody Map<String, String> params, @RequestHeader("Authorization") String token) {
// 旧密码、新密码校验...
// ==============================
// 删除 Redis 中的 token(你的写法)
// ==============================
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
operations.getOperations().delete(token);
return Result.success();
}
七 SpringBoot 配置属性的 4 种方式(优先级从高到低)
1. 命令行参数方式(优先级最高)
运行 jar 包时指定:
plaintext
java -jar big-event.jar --server.port=9999
格式:
plaintext
--键=值
特点:
- 临时生效
- 优先级最高
- 适合测试、快速改端口
2. 操作系统环境变量
电脑→高级设置→环境变量变量名:server.port变量值:8888
特点:
- 整个系统生效
- 优先级第二
3. 外部配置文件(jar 包外面的 application.yml)
把配置文件放在 和 jar 包同一目录:
plaintext
big-event.jar
application.yml
特点:
- 不用重新打包
- 方便生产环境修改配置
- 优先级第三
4. 内部配置文件(resources/application.yml)
项目里写的配置
plaintext
resources/application.yml
优先级最低。
✅ 优先级总结(必考)
命令行 > 环境变量 > 外部 yml > 内部 yml
二、多环境配置(最重点:开发、测试、生产)
1. 为什么要多环境?
- 开发环境:dev(本地电脑)
- 测试环境:test(公司测试服务器)
- 生产环境:pro(线上真正服务器)
环境不同,配置不同:
- 数据库地址不同
- 端口不同
- Redis 地址不同
- 日志级别不同
三、多环境配置的 两种拆分写法
🔥 写法一:多文件拆分(最常用、最标准)
1. 创建 3 个配置文件
plaintext
application-dev.yml 开发环境
application-test.yml 测试环境
application-pro.yml 生产环境
2. 每个文件写自己环境的配置
application-dev.yml
yaml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/big_event
username: root
password: 1234
application-test.yml
yaml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://test-server:3306/test_db
username: test
password: test123
application-pro.yml
yaml
server:
port: 80
3. 在主文件 application.yml 中激活
yaml
spring:
profiles:
active: dev # 激活开发环境
🔥 写法二:单文件多块拆分(--- 分隔)
一个 application.yml 里写所有环境,用 --- 隔开。
yaml
# 公共配置(所有环境共用)
spring:
profiles:
active: dev
---
# 开发环境
spring:
config:
activate:
on-profile: dev
server:
port: 8080
---
# 测试环境
spring:
config:
activate:
on-profile: test
server:
port: 8081
---
# 生产环境
spring:
config:
activate:
on-profile: pro
server:
port: 80
四、多环境分组(了解,企业高级用法)
把配置按功能分组,如:
- 服务器配置
- 数据库配置
- Redis 配置
文件:
plaintext
application-devServer.yml
application-devDB.yml
application-devRedis.yml
激活分组:
yml
spring:
profiles:
active: dev
group:
dev: devServer,devDB,devRedis

五、配置文件格式(重点)
1. properties 格式(老格式)
properties
server.port=8080
spring.datasource.username=root
2. yml 格式(现在主流)
yaml
server:
port: 8080
spring:
datasource:
username: root
✅ yml 最最最容易错的地方(你刚才启动失败就是这个!)
**yml 严禁使用 TAB 缩进!必须用空格!**错误:
yaml
server:
port: 8080 ❌ 用了TAB键
正确:
yaml
server:
port: 8080 ✅ 两个空格
六、超级完整版笔记总结(可直接背)
-
配置 4 种方式优先级:命令行 > 环境变量 > 外部 yml > 内部 yml
-
多环境 3 个:dev(开发)、test(测试)、pro(生产)
-
多环境两种写法:
- 多文件:
application-dev.yml - 单文件:用
---分隔
- 激活环境:
yaml
spring.profiles.active=dev
- yml 禁止用 TAB,只能用空格!
一、项目部署是什么?
把你写好的 SpringBoot 项目变成可直接运行的包(jar),放到服务器上让别人访问。
二、部署方式(考试 / 作业只考这个)
1)Jar 包部署(最常用、最简单)
SpringBoot 内置 Tomcat,直接打成 jar 就能运行。
三、Jar 包部署步骤(超级重点)
1️⃣ 打包项目
打开 IDEA 右侧 Maven → 先 clean 再 package
命令行也行:
plaintext
mvn clean package
生成位置:
plaintext
项目/target/big-event-1.0-SNAPSHOT.jar
2️⃣ 运行 Jar 包
进入 target 文件夹,运行命令:
plaintext
java -jar big-event-1.0-SNAPSHOT.jar
3️⃣ 运行时指定端口(优先级最高)
plaintext
java -jar big-event.jar --server.port=8888
4️⃣ 服务器要求(必背)
- 必须安装 JDK 17+
- 必须启动 MySQL
- 必须启动 Redis
- 配置文件里的数据库 / Redis 地址要正确
四、外部配置文件(企业常用)
把 application.yml 放到 和 jar 包同一级目录 ,修改配置不用重新打包。
结构:
plaintext
big-event.jar
application.yml
优先级:外部 yml > 内部 yml
五、命令行参数(优先级最高)
plaintext
java -jar big-event.jar --server.port=9999
六、配置优先级(整个部署最核心考点)
命令行参数 > 环境变量 > 外部 yml > 内部 yml