实战教程:手把手教你用原生线程安全拦截自研微服务框架中所有不合规的跨域跨页请求

轻明吖_9773

轻明吖_9773

2026-06-01

864人浏览

原创

精准识别不合规跨域跨页请求需在netty或filter早期阶段,基于origin、sec-fetch-site、referer等无状态校验,用threadlocal+预编译规则实现零锁判定,403即时响应并异步审计。

实战教程:手把手教你用原生线程安全拦截自研微服务框架中所有不合规的跨域跨页请求

直接用原生线程安全方式拦截不合规跨域跨页请求,关键不在“拦”,而在“精准识别+无状态决策+不拖慢主流程”。自研微服务框架通常已具备请求生命周期钩子(如 preHandle / filter chain),真正要做的,是把校验逻辑下沉到最轻量、最可控的环节——比如 Netty ChannelHandler 或 Servlet Filter 的 early phase,并确保校验本身不依赖共享可变状态。

明确哪些请求算“不合规跨域跨页”

先别急着写代码,得定义清楚拦截边界:

  • 跨域:Origin 头存在且与当前服务允许的域名列表(如配置项 cors.allowed-origins)不匹配,或 Origin 为 null / file:// / chrome-extension:// 等非 Web 页面常见非法来源
  • 跨页:不是同源单页应用(SPA)内部的 API 调用,而是从其他 HTML 页面发起的表单提交、iframe 嵌入、window.open 跳转等——可通过检查 Sec-Fetch-Site(值为 cross、none)、Referer(非空但非本域)、X-Requested-With 缺失等组合判断
  • 不合规:满足上述任一条件,且请求方法非 OPTIONS(预检放行)、响应头未提前设置 Access-Control-Allow-Origin、或携带了敏感凭证(Credentials: true)但 Origin 是通配符 *

用 ThreadLocal + 预编译规则实现零锁校验

避免 synchronized 或 ReentrantLock —— 拦截器每秒可能执行数万次,锁是性能杀手。正确做法是把校验逻辑做成纯函数式、无副作用:

MuseNet – OpenAI
MuseNet – OpenAI

MuseNet是 OpenAI 发布的实验性 AI 音乐生成研究项目。

下载
  • 将白名单域名、禁用协议列表、fetch site 映射规则等全部加载进 static final ConcurrentHashMap 或 Guava Cache,只读不改
  • 用 ThreadLocal 缓存一次解析结果(如 Origin URI、Referer Host),避免重复 parse;每次请求 init 时 set,finally clear
  • 对 Origin 做标准化处理:统一转小写、去掉末尾 /、拒绝含端口的非开发环境 Origin(生产环境不允许 localhost:8080 这类)

在 Filter 中早于业务逻辑做响应裁决

不要等 Controller 执行完再拦截——那已经浪费了 DB 查询、RPC 调用等资源。在标准 Servlet Filter 的 doFilter() 开头就完成判定:

  • 提取关键 header,调用校验工具类(无外部依赖、无日志打点、无异常抛出)
  • 若不合规,直接 response.setStatus(403) + response.getWriter().write("Forbidden"),然后 return
  • 务必调用 response.flushBuffer() 并返回,防止后续 filter 或 servlet 继续写响应体
  • 对预检请求(OPTIONS)单独放行,但需验证 Access-Control-Request-Method 是否在白名单中

记录与可观测性:不记日志,但留痕可查

高频拦截不能打 INFO/DEBUG 日志(IO 和 GC 压力大),但要保留审计能力:

  • 用高性能 RingBuffer(如 LMAX Disruptor)异步落库一条结构化记录:traceId、ip、origin、referer、method、blockedAt(毫秒级时间戳)
  • 暴露 /actuator/blocked-requests 接口,按分钟聚合统计拦截数、Top origin、Top referer,供运维快速感知攻击苗头
  • 对连续 5 次被拦的 IP,自动注入到本地限流器黑名单(内存 Map + 定时清理),无需中心化存储

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10037

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7162

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6312

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1316

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2649

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19971

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Hyperf官方中文手册(3.1)
Hyperf官方中文手册(3.1)

共0课时 | 0人学习

高级PHP之Swoft入门到微服务
高级PHP之Swoft入门到微服务

共56课时 | 6.3万人学习

webman初步使用及后台搭建
webman初步使用及后台搭建

共15课时 | 2.7万人学习