字节golang后端二面

news2025/7/21 2:50:09

前端接口使用restful格式,post与get的区别是什么?

在这里插入图片描述

HTTP网络返回的状态码有哪些?

在这里插入图片描述

go语言切片与数组的区别是什么?

在这里插入图片描述

MySQL实现并发安全避免两个事务同时对一个记录写操作的手段有哪些?

在这里插入图片描述

如何实现业务的幂等性(在golang代码中如何避免消息重复或处理已出现的消息重复)?

在这里插入图片描述

如何设置redis分布式锁?

在这里插入图片描述
SETNX 是 Redis 中的一个命令,全称为 “SET if Not eXists”。它的作用是在键不存在时设置键的值。具体来说,SETNX 的功能如下:

语法

SETNX key value

返回值

  • 1: 如果键成功设置(即键不存在)。
  • 0: 如果键已经存在,设置失败。

用法示例

1. 设置一个键
SETNX my_key "some_value"
  • 如果 my_key 不存在,则它的值被设置为 "some_value",返回 1。
  • 如果 my_key 已经存在,则不做任何操作,返回 0。
2. 用于分布式锁

SETNX 常用于实现分布式锁,因为它可以确保只有一个进程可以获得锁。例如:

import redis

# 连接到 Redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 尝试获取锁
if client.setnx("my_lock", "some_unique_value"):
    print("Lock acquired")
    # 执行临界区代码
    
    # 释放锁
    client.delete("my_lock")
else:
    print("Lock already acquired")

注意事项

  • 不适合复杂操作: SETNX 只能用于简单的键值设置,不能用于复杂的条件判断。
  • 锁的有效性: 在实现分布式锁时,结合使用 SETNX 和设置过期时间可以防止死锁。

在这里插入图片描述

ThreadLocal

ThreadLocal 是 Java 中的一个类,用于提供线程局部变量。每个使用 ThreadLocal 的线程都可以独立地存储和访问自己的变量副本,而不会与其他线程共享。以下是关于 ThreadLocal 的详细解释:

1. 基本概念

  • 线程局部变量: 每个线程在访问 ThreadLocal 变量时,会得到自己独立的副本。这意味着一个线程对 ThreadLocal 变量的修改不会影响其他线程。
  • 存储位置: ThreadLocal 变量存储在每个线程的 ThreadLocalMap 中。

2. 使用方法

2.1 创建 ThreadLocal 变量
ThreadLocal<String> threadLocalVar = new ThreadLocal<>();
2.2 设置值

使用 set() 方法将值存储到当前线程的 ThreadLocal 变量中。

threadLocalVar.set("Hello, ThreadLocal!");
2.3 获取值

使用 get() 方法从当前线程的 ThreadLocal 变量中获取值。

String value = threadLocalVar.get(); // 返回 "Hello, ThreadLocal!"
2.4 清除值

使用 remove() 方法可以清除当前线程的 ThreadLocal 变量值。

threadLocalVar.remove();

3. 示例代码

以下是一个使用 ThreadLocal 的简单示例:

public class ThreadLocalExample {
    private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) {
        Runnable task = () -> {
            Integer value = threadLocalValue.get();
            value++;
            threadLocalValue.set(value);
            System.out.println(Thread.currentThread().getName() + ": " + threadLocalValue.get());
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();
    }
}

4. 适用场景

  • 用户会话信息: 在 Web 应用中,可以使用 ThreadLocal 存储每个请求的用户信息。
  • 数据库连接: 每个线程可以持有自己的数据库连接,避免共享连接导致的线程安全问题。
  • 性能优化: 减少对象的创建和销毁,避免频繁的上下文传递。

5. 注意事项

  • 内存泄漏: 如果不调用 remove() 方法,线程局部变量可能会导致内存泄漏,尤其在使用线程池时。
  • 不适合跨线程使用: ThreadLocal 变量仅在创建它的线程中可见,其他线程无法访问。
  • 调试困难: 使用 ThreadLocal 可能会让调试变得复杂,因为变量的状态依赖于线程的生命周期。

总结

ThreadLocal 是一个强大的工具,适用于需要线程隔离的数据存储场景。合理使用可以提高性能和简化代码,但也需要注意内存管理和线程安全问题。

超卖问题怎么解决?

  • redis使用lua脚本判断和扣减库存
  • 使用redis队列避免数据不一致的问题(先将数据存入redis队列中,从redis队列中取出记录添加到数据库)

后端如何对一个请求鉴权?为什么JWT要双签发?被截获了怎么办?如果人为地想要禁止某个用户的访问应该怎么做?

一、后端请求鉴权流程

后端通常通过以下步骤验证请求合法性:

  1. Token 提取
    从请求头(如 Authorization: Bearer <token>)或 Cookie 中获取 JWT。
  2. 签名验证
    用预设密钥验证 JWT 签名是否被篡改(例如使用 HMAC 或 RSA 算法)。
  3. 有效期检查
    校验 exp(过期时间)和 nbf(生效时间)字段。
  4. 业务逻辑鉴权
    • 从 JWT 解析用户角色/权限(如 role: admin)。
    • 对比请求资源所需的权限(如 RBAC 模型)。
  5. 敏感操作二次验证
    关键操作(如支付)要求重新输入密码或 2FA 验证。
# Python 伪代码示例(使用 PyJWT)
def verify_request(request):
    token = request.headers.get("Authorization").split("Bearer ")[1]
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        if payload["role"] != "admin":
            raise PermissionError("无权访问")
        return True
    except jwt.ExpiredSignatureError:
        raise Unauthorized("Token过期")

二、JWT 双签发机制及作用

双签发(Dual-Issuer) 指同时使用两个密钥签发 Token:

  1. 主密钥(Primary Key)
    • 用于签发长期有效的 访问令牌(Access Token)(如有效期 1 小时)。
  2. 从密钥(Secondary Key)
    • 用于签发短期有效的 刷新令牌(Refresh Token)(如有效期 7 天)。

✔ 核心目的:安全性隔离

  • 访问令牌泄露风险高:频繁在网络传输,暴露概率大。
  • 刷新令牌严格保护:仅用于获取新访问令牌,存储于安全环境(如 HttpOnly Cookie)。
  • 攻击窗口最小化:即使 Access Token 被截获,有效期短且无法直接获取新 Token。

三、JWT 被截获的应对措施

攻击类型防御方案示例
中间人窃听强制 HTTPS + HSTS 头服务器配置 TLS 1.3
客户端脚本窃取HttpOnly Cookie 存储 + XSS 防护设置 Set-Cookie: HttpOnly; Secure
Token 泄露短期有效期 + 刷新令牌轮转Access Token 有效期 ≤15 分钟
重放攻击JTI(JWT ID)唯一标识 + 服务端黑名单使用 Redis 记录已使用的 JTI

刷新令牌轮转示例
每次用 Refresh Token 获取新 Access Token 时,同步生成新 Refresh Token 并作废旧令牌。这样即使旧刷新令牌被截获,攻击者只能使用一次。


四、禁止特定用户访问的解决方案

1. 短期封禁:令牌黑名单(Token Blacklist)
  • 适用场景:立即踢出已登录用户。
  • 实现方式
    • 用户注销或封禁时,将 JWT 的 jti(唯一ID)加入 Redis 黑名单。
    • 鉴权时校验 jti 是否在黑名单中。
  • 优点:实时生效。
  • 缺点:增加数据库查询开销。
# 封禁用户时
redis.set(f"blacklist:{jti}", "1", ex=ACCESS_TOKEN_EXPIRE)

# 鉴权时检查
if redis.exists(f"blacklist:{jti}"):
    raise Forbidden("用户已被封禁")
2. 长期封禁:用户状态标记
  • 适用场景:永久禁止访问。
  • 实现方式
    • 在用户数据库添加 is_active 字段。
    • 鉴权时查询用户状态(注意缓存用户信息避免频繁查库)。
  • 优点:一劳永逸。
  • 缺点:状态变更后需等待 Token 自然过期。
3. 强制令牌失效:刷新令牌回收
  • 封禁用户时,删除该用户的刷新令牌
  • 用户 Access Token 过期后无法续签,自动退出。

五、最佳实践总结

  1. 双签发必要性
    ✅ 隔离高风险令牌(Access Token)与高价值令牌(Refresh Token)。
  2. 防截获组合拳
    ✅ HTTPS + 短有效期 + HttpOnly Cookie + 刷新令牌轮转。
  3. 封禁用户策略
    • 紧急场景:令牌黑名单(实时生效)。
    • 永久封禁:标记用户状态 + 回收刷新令牌
  4. 性能优化
    • 黑名单用 Redis 存储并设置自动过期(与 Token 有效期对齐)。
    • 用户状态变化时清理缓存(如 Redis 中的用户信息)。

关键原则:JWT 本身无状态,需通过黑名单/用户状态引入必要状态控制,在安全性和性能间取得平衡。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode + cmake + ninja+ gcc 搭建MCU开发环境

vscode cmake ninja gcc 搭建MCU开发环境 文章目录 vscode cmake ninja gcc 搭建MCU开发环境1. 前言2. 工具安装及介绍2.1 gcc2.1.1 gcc 介绍2.1.2 gcc 下载及安装 2.2 ninja2.2.1 ninja 介绍2.2 ninja 安装 2.3 cmake2.3.1 cmake 介绍2.3.2 cmake 安装 2.4 VScode 3. 上手…

三种经典算法优化无线传感器网络(WSN)覆盖(SSA-WSN、PSO-WSN、GWO-WSN),MATLAB代码实现

三种经典算法优化无线传感器网络(WSN)覆盖&#xff08;SSA-WSN、PSO-WSN、GWO-WSN&#xff09;&#xff0c;MATLAB代码实现 目录 三种经典算法优化无线传感器网络(WSN)覆盖&#xff08;SSA-WSN、PSO-WSN、GWO-WSN&#xff09;&#xff0c;MATLAB代码实现效果一览基本介绍程序设…

JVM 核心组件深度解析:堆、方法区、执行引擎与本地方法接口

一、JVM 堆内存&#xff1a;对象的生存与消亡之地 作为 Java 虚拟机中最大的内存区域&#xff0c;堆内存是所有对象实例的 “出生地” 与 “安息所”。从程序运行的角度看&#xff0c;所有通过new关键字创建的对象都在堆中分配内存&#xff0c;其生命周期完全由垃圾回收机制&am…

OpenCV4.4.0下载及初步配置(Win11)

目录 OpenCV4.4.0工具下载安装环境变量系统配置 OpenCV4.4.0 工具 系统&#xff1a;Windows 11 下载 OpenCV全版本百度网盘链接&#xff1a;: https://pan.baidu.com/s/15qTzucC6ela3bErdZ285oA?pwdjxuy 提取码: jxuy找到 opencv-4.0.0-vc14_vc15 下载得到 安装 运行op…

使用Mathematica观察多形式根的分布随参数的变化

有两种方式观察多项式的根随着参数变化&#xff1a;&#xff08;1&#xff09;直接制作一个小的动态视频&#xff1b;&#xff08;2&#xff09;绘制所有根形成的痕迹&#xff08;locus&#xff09;。 制作动态视频&#xff1a; (*Arg-plane plotting routine with plotting …

【C++高级主题】转换与多个基类

目录 一、多重继承的虚函数表结构&#xff1a;每个基类一个虚表 1.1 单继承与多重继承的虚表差异 1.2 代码示例&#xff1a;多重继承的虚函数覆盖 1.3 虚表结构示意图 二、指针与引用的类型转换&#xff1a;地址调整的底层逻辑 2.1 派生类指针转基类指针的地址偏移 2.2 …

『uniapp』添加桌面长按快捷操作 shortcuts(详细图文注释)

目录 手机环境适配说明安卓效果图代码 iOS(暂未实测,没有水果开发者)总结 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 手机环境适配说明 个别手机系统可能需要进行特别的权限设置,否则会无法使用 桌面快捷方式: 已知的有…

【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步

目录 一、什么是 LLM&#xff1f;语言的天才&#xff0c;思维的起点 ✅ 特点小结&#xff1a; 二、什么是 Agent&#xff1f;智能的执行者&#xff0c;自主的决策者 ✅ 特点小结&#xff1a; 三、LLM 与 Agent 的关系&#xff1a;是工具&#xff0c;更是大脑 四、案例实战…

麦克风和电脑内播放声音实时识别转文字软件FunASR整合包V5下载

我基于FunASR制作的实时语音识别转文字软件当前更新到V5版本。软件可以实时识别麦克风声音和电脑内播放声音转为文字。 FunASR软件介绍 FunASR 是一款基础语音识别工具包和开源 SOTA 预训练模型&#xff0c;支持语音识别、语音活动检测、文本后处理等。 我使用FunASR制作了一…

PyTorch——卷积层(3)

conv_arithmetic/README.md at master vdumoulin/conv_arithmetic GitHub out_channel1 out_channel2

从 PyTorch 到 TensorFlow Lite:模型训练与推理

一、方案介绍 研发阶段&#xff1a;利用 PyTorch 的动态图特性进行快速原型验证&#xff0c;快速迭代模型设计。 灵活性与易用性&#xff1a;PyTorch 是一个非常灵活且易于使用的深度学习框架&#xff0c;特别适合研究和实验。其动态计算图特性使得模型的构建和调试变得更加直…

【存储基础】存储设备和服务器的关系和区别

文章目录 1. 存储设备和服务器的区别2. 客户端访问数据路径场景1&#xff1a;经过服务器处理场景2&#xff1a;客户端直连 3. 服务器作为"中转站"的作用 刚开始接触存储的时候&#xff0c;以为数据都是存放在服务器上的&#xff0c;服务器和存储设备是一个东西&#…

5.29打卡

浙大疏锦行 DAY 38 Dataset和Dataloader类 知识点回顾&#xff1a; 1. Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09; 2. Dataloader类 3. minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图…

【黑马程序员uniapp】项目配置、请求函数封装

黑马程序员前端项目uniapp小兔鲜儿微信小程序项目视频教程&#xff0c;基于Vue3TsPiniauni-app的最新组合技术栈开发的电商业务全流程_哔哩哔哩_bilibili 参考 有代码&#xff0c;还有app、h5页面、小程序的演示 小兔鲜儿-vue3ts-uniapp-一套代码多端部署: 小兔鲜儿-vue3ts-un…

PyTorch——DataLoader的使用

batch_size, drop_last 的用法 shuffle shuffleTrue 各批次训练的图像不一样 shuffleFalse 在第156step顺序一致

Predixy的docker化

概述 当前已有一套redis cluster的集群&#xff0c;但是fs中的hiredis只能配置单实例redis。 AI了一下方案&#xff0c;可以使用redis的proxy组件来实现从hiredis到redis cluster的互通。 代码地址&#xff1a;https://github.com/joyieldInc/predixy Predixy特性介绍&…

C++ 之 多态 【虚函数表、多态的原理、动态绑定与静态绑定】

目录 前言 1.多态的原理 1.1虚函数表 1.2派生类中的虚表 1.3虚函数、虚表存放位置 1.4多态的原理 1.5多态条件的思考 2.动态绑定与静态绑定 3.单继承和虚继承中的虚函数表 3.1单继承中的虚函数表 3.2多继承(非菱形继承)中的虚函数表 4.问答题 前言 需要声明的&#x…

【JavaWeb】Maven、Servlet、cookie/session

目录 5. Maven6. Servlet6.1 Servlet 简介6.2 HelloServlet6.3 Servlet原理6.4 Mapping( **<font style"color:rgb(44, 44, 54);">映射 ** )问题6.5 ServletContext6.6 HttpServletResponse<font style"color:rgb(232, 62, 140);background-color:rgb(…

Rust 编程实现猜数字游戏

文章目录 编程实现猜数字游戏游戏规则创建新项目默认代码处理用户输入代码解析 生成随机数添加依赖生成逻辑 比较猜测值与目标值类型转换 循环与错误处理优化添加循环优雅处理非法输入​ 最终完整代码核心概念总结 编程实现猜数字游戏 我们使用cargo和rust实现一个经典编程练习…

关于神经网络中的激活函数

这篇博客主要介绍一下神经网络中的激活函数以及为什么要存在激活函数。 首先&#xff0c;我先做一个简单的类比&#xff1a;激活函数的作用就像给神经网络里的 “数字信号” 加了一个 “智能阀门”&#xff0c;让机器能学会像人类一样思考复杂问题。 没有激活i函数的神经网络…