- 博客(13)
- 收藏
- 关注
原创 【pmhub-base-core模块,XssFilter与XssHttpServletRequestWrapper】
本文介绍了Java Web应用中防范XSS攻击的两个核心类:XssFilter和XssHttpServletRequestWrapper。XssFilter作为过滤器入口,通过配置排除项决定哪些请求需要过滤;XssHttpServletRequestWrapper采用装饰器模式,重写请求处理方法对输入数据进行XSS清理。主要实现机制包括:1) 通过excludes列表配置白名单URL;2) 默认跳过GET/DELETE请求;3) 使用EscapeUtil对请求参数、头信息和输入流进行HTML转义处理。这两个
2025-11-27 20:51:51
1013
原创 【pmhub-base-core模块,@Xss与XssValidator】
本文介绍了两种互补的XSS防御策略:全局过滤器和精准校验注解。重点分析了基于JSR-303规范实现的@Xss自定义校验方案,包含注解定义和校验逻辑实现。@Xss注解可标记需校验字段,其校验器通过正则表达式检测HTML标签。使用时只需在DTO字段添加注解,配合Spring校验机制即可实现业务层精准防御。与全局过滤器相比,这种方案更灵活可控,适用于需要严格限制HTML输入的场景。
2025-11-27 20:47:22
391
原创 【ReentrantLock.ConditionObject#await() 与 ReentrantLock.ConditionObject#signal() 执行链路源码解析】
Condition 的队列是独立于 AQS 同步队列的await()把线程放到 condition 链上并释放锁;只有signal()才把线程从 condition 链“转移”到 AQS 同步队列。转移路径await()→→→park()(等待);signal()→→enq(node)(同步队列尾插)→(可能)→ 等待者在同步队列上恢复锁状态后继续执行。中断/取消:在 condition 等待期间发生的中断会触发特殊处理(),保证语义一致并且链表不被污染。为什么设计成两级队列。
2025-11-02 13:19:46
843
原创 【公平可重入锁 ReentrantLock#lock() 与 unlock() 的执行链路源码解析】
维度非公平(NonfairSync)公平(FairSync)lock()的实现先尝试(快抢),失败再acquire(1)直接acquire(1)(不先快抢)tryAcquire中是否检查队列不检查(或非公平实现的tryAcquire在快速路径里不调用使用来判断是否有前驱,若有前驱则不抢占插队可能性允许插队(后来线程可能成功 CAS 抢到锁,即使有人在队列中)不允许插队(尊重先到先得)性能开销更高吞吐,低延迟(尤其在低争用下)延迟更大,吞吐可能更低(因过多的队列检查与更严格调度)适用场景。
2025-11-02 12:08:44
942
原创 【非公平可重入锁 RentrantLock#lock() 与 unlock() 的执行链路源码解析】
state含义:在 ReentrantLock 中表示当前持有锁的重入计数,arg通常是1。快速路径 vs 慢路径:非公平锁优先用 CAS 快速获得锁;若失败则入队(可能又有快速 tail 插入)。队列保证公平性只有在时才调用tryAcquire,从而保证队列 FIFO 的“唤醒顺序”。park/unpark 协议:通过waitStatus的SIGNAL标志和的状态转换,防止“挂起后无人唤醒”或“唤醒丢失”的 race。中断处理:不可中断的acquire。
2025-11-01 21:45:27
635
原创 【Tomcat线程池 vs JDK原生线程池】
✅若任务数 < 核心线程数 → 创建线程;若任务数 ≥ 核心线程数 → 入队;若队列满 → 创建救急线程;若线程数 ≥ 最大线程数 → 拒绝任务。✅若任务数 < 核心线程数 → 创建线程;若任务数 ≥ 核心线程数 且 < 最大线程数 → 创建救急线程;若任务数 ≥ 最大线程数 → 入队;若队列满 → 拒绝任务。
2025-10-28 21:58:22
408
原创 【线程池正确处理异常的三种方式】
🧩线程池异常不外抛,try…catch要记牢;Callable + Future能回报,Handler兜底最可靠。
2025-10-28 21:02:22
415
原创 【原子累加器LongAdder#longAccumulate()源码解析】
(1)快速路径 base CAS;(2)条带 cells 的定位与 lazy 初始化;(3)当局部 CAS 失败时采取的自适应策略(扰动 probe / 扩容 / 退回)。
2025-10-26 16:27:47
667
原创 【原子累加器LongAdder#add(long)源码解析】
1. 尝试用 CAS 修改 base(乐观、快路径)2. 如果失败(竞争出现):2.1 若 cells 已存在,则根据线程哈希选取 cell 并 CAS 更新2.2 若 cell 不存在或 CAS 仍失败,调用 longAccumulate() 自适应扩容/重试。
2025-10-26 15:49:39
466
原创 【CPU缓存行伪共享--缓存一致性问题】
概念类比解释缓存行像快递箱子,每次搬一整箱(64字节)伪共享不同人放自己的物品在同一个箱子里,你改一件,别人整箱都得重拿缓存一致性保证各个箱子里的内容是最新的,一旦有人修改,就要通知其他人废弃旧箱@Contended / 填充给每个人单独一个箱子,互不影响,搬运快得多。
2025-10-26 14:48:42
621
原创 【线程安全的单例实现方式三:synchronized的懒汉式、双重检查+volatile的懒汉式、静态内部类的懒汉式】
你现在的实现是懒加载但不是线程安全。它在多线程下会发生重复创建和“半初始化对象”问题。推荐改成静态内部类、DCL+volatile,或更稳妥地使用枚举或饿汉式(视乎是否需要延迟初始化)。
2025-10-23 22:10:29
785
原创 【线程安全的单例实现方式二:枚举单例】
问题答案概要关键原理1️⃣ 限制实例个数由枚举常量个数决定,JVM 自动创建JVM & Enum 机制2️⃣ 是否线程安全是,类初始化阶段由 JVM 同步保证class init 锁3️⃣ 是否能被反射破坏否,JVM 禁止反射创建 enum 实例4️⃣ 是否能被反序列化破坏否,反序列化根据名字返回现有实例5️⃣ 属于哪种单例介于懒汉与饿汉之间:类加载时创建延迟加载的饿汉式6️⃣ 如何初始化逻辑在枚举构造器中执行即可构造器线程安全执行一次。
2025-10-23 21:45:51
1011
原创 【线程安全的单例实现方式一:饿汉式】
final好 —— 我来把这段“饿汉式单例”逐条拆开解释,并把你注释里的问题一条条回答清楚,同时补充容易忽视的攻击面(序列化 / 反射 / 克隆 / 类加载器)以及几个可选的改进方案和理由。下面逐条回答并解释关键点。
2025-10-23 21:24:56
948
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅