大事件板块三

一、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  ✅ 两个空格

六、超级完整版笔记总结(可直接背)

  1. 配置 4 种方式优先级:命令行 > 环境变量 > 外部 yml > 内部 yml

  2. 多环境 3 个:dev(开发)、test(测试)、pro(生产)

  3. 多环境两种写法:

  • 多文件:application-dev.yml
  • 单文件:用 --- 分隔
  1. 激活环境:

yaml

复制代码
spring.profiles.active=dev
  1. 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️⃣ 服务器要求(必背)

  1. 必须安装 JDK 17+
  2. 必须启动 MySQL
  3. 必须启动 Redis
  4. 配置文件里的数据库 / Redis 地址要正确

四、外部配置文件(企业常用)

application.yml 放到 和 jar 包同一级目录 ,修改配置不用重新打包

结构:

plaintext

复制代码
big-event.jar
application.yml

优先级:外部 yml > 内部 yml


五、命令行参数(优先级最高)

plaintext

复制代码
java -jar big-event.jar --server.port=9999

六、配置优先级(整个部署最核心考点)

命令行参数 > 环境变量 > 外部 yml > 内部 yml

相关推荐
JavaAgent架构师1 小时前
前端AI工程化(五):AI对话状态管理
前端·人工智能
ricardo19732 小时前
一张图搞懂 HTTP 缓存:强缓存、协商缓存与最佳 Cache-Control 配置
前端
程序员码歌2 小时前
别再让 AI 自由发挥了:OpenSpec 才是团队协作不跑偏的关键
android·前端·人工智能
用户11481867894842 小时前
Vue 开发者快速上手 Flutter(二)
前端
用户11481867894842 小时前
Vue 开发者快速上手 Flutter(三)
前端
JavaAgent架构师2 小时前
前端AI工程化(六):Function Calling与RAG前端实践
前端·人工智能
用户11481867894842 小时前
Vue 开发者快速上手 Flutter(一)
前端
鹏多多2 小时前
Trae cn里使用Pencil来制作设计图的手把手教程
前端·ai编程·trae
客场消音器2 小时前
如何使用codex进行UI重构,让AI开发的前端页面不再千篇一律
前端·后端·微信小程序