字节golang后端二面

前端接口使用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.pswp.cn/bicheng/83286.shtml

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

相关文章

Spring Security安全实践指南

安全性的核心价值 用户视角的数据敏感性认知 从终端用户角度出发,每个应用程序都涉及不同级别的数据敏感度。以电子邮件服务与网上银行为例:前者内容泄露可能仅造成隐私困扰,而后者账户若被操控将直接导致财产损失。这种差异体现了安全防护需要分级实施的基本原则: // 伪…

Leetcode第451场周赛分析总结

题目链接 竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目解析 A. 3560. 木材运输的最小成本 AC代码 class Solution { public:long long minCuttingCost(int n, int m, int k) {if (n > m) swap(n, m); // n < m;using ll long lon…

Linux中的shell脚本

什么是shell脚本 shell脚本是文本的一种shell脚本是可以运行的文本shell脚本的内容是由逻辑和数据组成shell脚本是解释型语言 用file命令可以查看文件是否是一个脚本文件 file filename 脚本书写规范 注释 单行注释 使用#号来进行单行注释 多行注释 使用 : " 注释内容…

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术

MYSQL&#xff1a; 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集&#xff0c;失败为false; 成功返回结果:SQL指令没有错误&#xff0c;但是查询结果…

数学分析——一致性(均匀性)和收敛

目录 1. 连续函数 1.1 连续函数的定义 1.2 连续函数的性质 1.2.1 性质一 1.2.2 性质二 1.2.3 性质三 1.2.4 性质四 2. 一致连续函数 2.1 一致连续函数的定义 2.2 一致连续性定理(小间距定理)(一致连续函数的另一种定义) 2.3 一致连续性判定法 2.4 连…

湖北理元理律师事务所:企业债务优化的科学路径与人文关怀

湖北理元理律师事务所&#xff1a;企业债务优化的科学路径与人文关怀 在中小企业经营压力增大的背景下&#xff0c;如何平衡债务清偿与员工生计成为关键课题。湖北理元理律师事务所联合计划集团公司&#xff0c;为服务企业设计了一套兼顾法律合规性与民生保障的债务解决方案&a…

树莓派安装openwrt搭建软路由(ImmortalWrt固件方案)

&#x1f923;&#x1f449;我这里准备了两个版本的openwrt安装方案给大家参考使用&#xff0c;分别是原版的OpenWrt固件以及在原版基础上进行改进的ImmortalWrt固件。推荐使用ImmortalWrt固件&#xff0c;当然如果想直接在原版上进行开发也可以&#xff0c;看个人选择。 &…

一键净化Excel数据:高性能Python脚本实现多核并行清理

摘要 本文分享两个基于Python的Excel数据净化脚本&#xff0c;通过多进程并行技术清除工作表内不可见字符、批注、单元格样式等冗余内容&#xff0c;利用OpenPyXL实现底层操作&#xff0c;结合tqdm进度条和进程级任务分配&#xff0c;可快速处理百万级单元格数据。适用于数据分…

【Netty】EventLoopGroup

在Netty的ServerBootstrap中设置两个EventLoopGroup的作用是将网络操作的两个关键阶段分离到不同的线程组中处理&#xff0c;从而优化性能并简化并发控制。具体来说&#xff1a; 1. 两个EventLoopGroup的角色 第一个EventLoopGroup&#xff08;通常称为bossGroup&#xff09;&…

【前端】Vue中使用CKeditor作为富文本编辑器

官网https://ckeditor.com/ 此处记录一下我在使用的时候具体初始化的代码。 <template><div><textarea :id"id"></textarea></div> </template><script> export default {name: CkEditor,data: function () {return {id:…

前端面经 websocket

应用层协议&#xff0c;实现一个TCP连接上的全双工通信&#xff0c;实时通讯 之前的实时WEB 实现轮询 增加轮询频率 ws wss 明文版本 和 密文版本 特点 # 1 头部小 2 更注重实时性

【笔记】suna部署之获取 Supabase API key 和 project URL

#工作记录 Supabase | The Open Source Firebase Alternative 一、注册与登录 方式一&#xff1a;GitHub 授权登录 在登录页面选择 “继续使用 GitHub” &#xff0c;跳转到 GitHub 授权页面&#xff08;如图 5 所示&#xff09;。确认 “Supabase 的想要访问您的 [账户名] 帐…

爬虫工具链的详细分类解析

以下是针对爬虫工具链的详细分类解析&#xff0c;涵盖静态页面、动态渲染和框架开发三大场景的技术选型与核心特性&#xff1a; &#x1f9e9; 一、静态页面抓取&#xff08;HTML结构固定&#xff09; 工具组合&#xff1a;Requests BeautifulSoup 适用场景&#xff1a;目标数…

STM32F407寄存器操作(ADC非连续扫描模式)

1.前言 书接上回&#xff0c;在看手册的时候我突然发现手册上还描述了另一种ADC扫描模式&#xff0c;即非连续扫描模式&#xff0c;想着连续扫描模式都已经探索过了&#xff0c;那就顺手把非非连续模式研究一下吧。 2.理论 我们先看看手册&#xff0c;这里我就以规则通道举例…

spring切面

概念 两个特点&#xff1a; IOC控制反转AOP主要用来处理公共的代码 例如一个案例就是添加用户&#xff0c;重复的代码包含了记录日志、事务提交和事务回滚等&#xff0c;都是重复的&#xff0c;为了简单&#xff0c;交给AOP来做。 即将复杂的需求分解出不同方面&#xff0c…

[Python] Python中的多重继承

文章目录 Lora中的例子 Lora中的例子 https://github.com/michaelnny/QLoRA-LLM/blob/main/qlora_llm/models/lora.py#L211C1-L243C10如果继承两个父类&#xff0c;并且父类的__init__参数不一样&#xff0c;则可以显式的调用父类init&#xff1b;如果用super().__init__()则需…

rsync服务的搭建

目录 一、rsync介绍 rsync的安装 二、rsync的语法 三、rsync命令使用 1. 本机同步 2. 远程同步 四、rsync作为服务使用 1、尝试启动rsync程序 2、rsync的配置文件介绍 注意事项&#xff1a; 3. rsyncinotify实时同步 3.依赖服务托管xinetd&#xff08;CentOS 6中rs…

【C/C++】面试基础题目收集

C 软件开发面试中常见的刷题题目通常可分为以下几大类&#xff1a;数据结构与算法、系统编程、面向对象设计、C 语言特性、并发编程等。 &#x1f9e0; 一、数据结构与算法&#xff08;力扣/牛客经典题&#xff09; 掌握 STL 和底层结构实现能力&#xff1a; &#x1f4cc; 数…

将手机网络经USB数据线和本地局域网共享给华为AP6050DN无线接入点

引言 由于最近装毕的新家所在的小区未能及时通宽带,于是家中各类无线设备如何上网就成了首要要解决的问题。 鉴于家中要联网的设备多、类型杂、支持频段也不一,总是开手机热点不是回事儿,于是就想着把手机网络引至华为AP6050DN无线接入点中,让家中所有的无线设备都能快速高…

【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​

深度优先搜索 导读&#xff1a;从广度到深度&#xff0c;探索图的遍历奥秘一、深度优先搜索二、算法思路三、算法逻辑四、算法评价五、深度优先生成树六、有向图与无向图结语&#xff1a;深潜与回溯&#xff0c;揭开图论世界的另一面 导读&#xff1a;从广度到深度&#xff0c;…