字节golang后端二面

article/2025/8/12 14:40:18

前端接口使用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 Trueexcept 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.hkcw.cn/article/jZnHklLxxi.shtml

相关文章

MyBatis03——SpringBoot整合MyBatis

目录 一、springboot整合mybatis 二、搭建环境 1、引入jar包 2、配置文件 3、准备控制层、业务层、持久层 4、SQLMapper文件 ​编辑 三、动态sql 四、分页 4.1逻辑分页 4.2物理分页 4.2.1引入分页插件在pom.xml 4.2.2使用分页插件 五、事务 编程式事务 声明式事…

【linux】知识梳理

操作系统的分类 1. 桌⾯操作系统: Windows/macOS/Linux 2. 移动端操作系统: Android(安卓)/iOS(苹果) 3. 服务器操作系统: Linux/Windows Server 4. 嵌⼊式操作系统: Android(底层是 Linux) Liunx介绍 liunx系统:服务器端最常见的操作系统类型 发行版:Centos和Ubuntu 远程连接操…

计算机网络第1章(上):网络组成与三种交换方式全解析

目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换&#xff08;Circuit Switching&#xff09;3.2 报文交换&#xff08;Message Switching&#xff09;3.3 分组交换&#xff08;Pa…

经典面试题:一文了解常见的缓存问题

在面试过程中&#xff0c;面试官的桌子上摆放着很多高频的面试题&#xff0c;能否顺利回答决定了你面试通过的概率。其中缓存问题就是其中的一份&#xff0c;可以说掌握缓存问题及解决方法是面试前必须准备的内容。那么缓存有什么典型的问题&#xff0c;出现的原因是什么&#…

Python Turtle实战:打造高精度图形化秒表

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测…

OVD开放词汇检测 Detic 训练COCO数据集实践

0、引言 纯视觉检测当前研究基本比较饱和&#xff0c;继续创新提升空间很小&#xff0c;除非在CNN和transformer上提出更强基础建模方式。和文本结合是当前的一大趋势&#xff0c;也是计算机视觉和自然语言处理结合的未来趋势&#xff0c;目前和文本结合的目标检测工作还是有很…

leetcode0404. 左叶子之和-easy

1 题目&#xff1a;左叶子之和 官方标定难度&#xff1a;易 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#…

PINNs案例——二维磁场计算

基于物理信息的神经网络是一种解决偏微分方程计算问题的全新方法… 有关PINN基础详见&#xff1a;PINNs案例——中心热源温度场预测问题的torch代码 今日分享代码案例&#xff1a;二维带电流源磁场计算 该案例参考学习论文&#xff1a;[1]张宇娇&#xff0c;孙宏达&#xff0…

历年西安邮电大学计算机保研上机真题

历年西安邮电大学计算机保研上机真题 2025西安邮电大学计算机保研上机真题 2024西安邮电大学计算机保研上机真题 2023西安邮电大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 狗剩游泳 题目描述 酷暑难耐&#xff0c;好消息传来&#xff0c;毛…

【算法题】算法一本通

每周更新至完结&#xff0c;建议关注收藏点赞。 目录 待整理文章已整理的文章方法论数组与哈希表栈双指针&#xff08;滑动窗口、二分查找、链表&#xff09;树前缀树堆 优先队列&#xff08;区间/间隔问题、贪心 &#xff09;回溯图一维DP位操作数学与几何学二维DP随缘更新&a…

Spring如何实现组件扫描与@Component注解原理

Spring如何实现组件扫描与Component注解原理 注解配置与包扫描的实现机制一、概述&#xff1a;什么是注解配置与包扫描&#xff1f;二、处理流程概览三、注解定义ComponentScope 四、核心代码结构1. ClassPathScanningCandidateComponentProvider2. ClassPathBeanDefinitionSca…

NLP学习路线图(十六):N-gram模型

一、为何需要语言模型&#xff1f;概率视角下的语言本质 自然语言处理的核心挑战在于让机器“理解”人类语言。这种理解的一个关键方面是处理语言的歧义性、创造性和结构性。语言模型&#xff08;Language Model, LM&#xff09;为此提供了一种强大的数学框架&#xff1a;它赋…

使用ReactNative加载HarmonyOS Svga动画

这是一款使用ReactNative 加载HarmonyOS Svga动画的播放器插件 三端Svga动画统一使用点击这里 版本:v1.1.2 react-native-ohos-svgaplayer [!TIP] Github 地址 安装与使用 npm npm install react-native-ohos-svgaplayer yarn yarn add react-native-ohos-svgaplayer下面…

电路图识图基础知识-高、低压供配电系统一次系统识图(十一)

1、高、低压供配电 一 次系统的介绍 供配电系统中输送、分配和使用电能的电路&#xff0c;称为一次电路或一次回路&#xff0c;也称为一次系统或主接线。控制、指示、测量和保护一次电路及其中设备运行的电路&#xff0c;称为二次电路或二次回路.也称为二次系统。 工厂供配电系…

read-bridge开源程序是AI 增强阅读工具,使用 n+1 方法进行沉浸式语言学习。通过留在目标语言生态系统中学习语言,具有以流状态为中心的界面。

​一、软件介绍 文末提供程序和源码下载 read-bridge开源程序是AI 增强阅读工具&#xff0c;使用 n1 方法进行沉浸式语言学习。通过留在目标语言生态系统中学习语言&#xff0c;具有以流状态为中心的界面。 二、Overview 概述 此阅读助手支持源到源语言学习方法&#xff0c;减…

调教 DeepSeek - 输出精致的 HTML MARKDOWN

【序言】 不知道是不是我闲的蛋疼&#xff0c;对百度AI 和 DeepSeek 的回答都不太满意。 DeepSeek 回答句子的引用链接&#xff0c;始终无法准确定位。有时链接只是一个域名&#xff0c;有时它给的链接是搜索串如: baidu.com/?q"搜索内容"。 百度AI 回答句子的引用…

【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】

论文阅读 | PR 2024 |ICAFusion&#xff1a;迭代交叉注意力引导的多光谱目标检测特征融合 1.摘要&&引言2.方法2.1 架构2.2 双模态特征融合&#xff08;DMFF&#xff09;2.2.1 跨模态特征增强&#xff08;CFE&#xff09;2.2.2 空间特征压缩&#xff08;SFS&#xff09;…

本振相参解析(1)2025.6.1

前言 本振相参是射频与通信系统中的关键技术概念&#xff0c;涉及本机振荡器&#xff08;LO&#xff09;信号的相位稳定性和多信号间的相干性控制。以下从定义、关键技术、应用场景及挑战等方面展开分析&#xff1a; 一、核心概念解析 本振&#xff08;Local Oscillator, LO…

一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (一)

整体链路 [应用服务器] --> [Filebeat] --> [Logstash] --> [Elasticsearch] --> [Kibana] 组件职责 Kibana&#xff1a; 可视化和分析日志数据Elasticsearch&#xff1a; 存储和索引日志数据Logstash&#xff1a; 解析、转换和丰富日志数据Filebeat&#xff1a…