04-一个请求的完整旅程
04-一个请求的完整旅程前面三篇讲了全景、哲学、模式。从这篇开始进入代码。以一次分页查询用户列表和一次审批通过任务为例把 HTTP 请求从浏览器到 Oracle 再回来的每一跳拆开——这一篇是后面所有引擎类文章的索引。文章目录04-一个请求的完整旅程一、例一分页查询 POST /ea/page/SYS_USER_s第1跳JwtAuthFilterplatform模块第2跳EaControllerformbuilder模块第3跳EaEnginemetadata模块第4跳返回二、例二审批通过 POST /api/workflow/process/complete三、两条链的公共部分四、系列后续怎么展开一、例一分页查询 POST /ea/page/SYS_USER_s第1跳JwtAuthFilterplatform模块browise-platform/src/main/java/com/browise/platform/auth/JwtAuthFilter.java6.0KBorder1 的原生 Filter不依赖Spring Security。① enabled检查browise.auth.enabled配置开关 ② excludePaths匹配/auth/ /login /captcha /error 放行支持/**前缀 ③ extractTokenAuthorization: Bearer xxx → 没有则查Cookie BROWISE_AT ④ JwtUtil.validateHS256验签 exp过期检查 ⑤ JwtBlacklist双查 isInvalid(psnId, iat) ← 用户级改密后iat之前的全失效 isInvalidByToken(token) ← token级登出单设备 ⑥ CacheManager.getUserProfile(psnId) → OP_PERSON SYS_USER.STATUS禁用即拒 ⑦ CurrentUser.set(profile) ← ThreadLocal业务代码随处可取 ⑧ MenuAuthProvider.canAccess(profile, /ea/page) → 用户角色 → SYS_ROLE_MENU → 菜单路径匹配 → 不匹配返回403 ⑨ finally CurrentUser.clear() ← ThreadLocal必须清否则线程池复用串用户第2跳EaControllerformbuilder模块browise-formbuilder/.../controller/EaController.java15.2KBPostMapping(/ea/page/{sqlId})publicResultpage(PathVariableStringsqlId,RequestBodyMapString,Objectparams){intpageNum...,pageSize...;ListMapString,ObjectrowseaEngine.query(sqlId,params,pageNum,pageSize);longtotaleaEngine.count(sqlId,params);returnResult.ok(PageResult.of(rows,total));}第3跳EaEnginemetadata模块browise-metadata/.../ea/core/engine/EaEngine.java549行内部五步① EaMetadataCache.get(sqlId) → ConcurrentHashMap查缓存 → 命中EaSqlMeta EaTableMeta[] EaFieldMeta[] EaConditionMeta[] → 未命中抛EA_NOT_FOUND启动时MetadataLoader已全量装载 ② SqlBuilder.buildSelect(sqlId, params, dialect) → appendColumns按EaFieldMeta.dataType(1字符/2日期/3数字/4日期时间) 选方言列表达式Oracle: to_char(birth,yyyymmdd) → appendFromEaTableMeta多表JOIN或主表 → where 11 → appendJoinAndWhere按EaConditionMeta拼条件 conditionType1固定值始终拼接动态参数null跳过 ③ dialect.paginate(sql, orderBy, start, end) → OracleDialectROWNUM三层包装第10篇专述 → MySqlDialectLIMIT ? OFFSET ? ④ EaConnectionProvider.getConnection() → BrowiseEaProvider从Spring DataSource取连接 → PreparedStatement参数化执行禁止字符串拼接 ⑤ postProcess(rows) → 遍历EaFieldMeta isEncrypted() → Sm4EncryptStrategy.decrypt()逐字段解密 isMasked() → maskRule(3,4)脱敏→320***********1234 → SlowSqlMonitor.check(sql, params, elapsedMs) 超阈值log.warn 可选文件追加第4跳返回Result { code:0, msg:success, data:{ rows:[...], total:137 } } → GlobalExceptionHandler兜底任何异常→Result.error(-1,msg) → 前端httpClient.ts响应拦截code!0抛业务错误401触发登出 → useRowSet灌入primary缓冲_t全为0 → MetaGrid渲染二、例二审批通过 POST /api/workflow/process/complete这条链更长穿platform→workflow→metadata三个模块① JwtAuthFilter同上 ② ProcessControllerbrowise-workflow/.../ProcessController.java28.9KB ├─ resolveFormSqlid(taskId) │ → WorkflowConfigService.findForm()查ACT_RE_BINDINGFORM │ → 拿到流程节点绑定的表单sqlId │ ├─ 表单数据upsert到T_DATA │ → FormDataMapper存在则update不存在则insert │ → 走EA引擎的insert/updateByFields │ └─ FlowableProcessService.completeTask(taskId, variables) │ ├─ ①前置拦截器 │ InterceptorChainService按TaskInterceptorConfig表 │ 读before拦截器id串从ApplicationContext取Bean执行 │ ├─ ②taskService.complete() │ → Flowable引擎推进到下一节点 │ ├─ ③后置拦截器 │ 同①after id串 │ └─ ④下一任务处理人通知 → WorkflowNotifyService发WorkflowMessageEventSpring事件 → TransactionalEventListener(AFTER_COMMIT)监听 → 事务提交后才WebSocket推送 ← 关键事务没提交就推送用户点待办却查不到数据三、两条链的公共部分环节组件位置认证JwtAuthFilter CurrentUser(ThreadLocal)platform鉴权菜单RBAC AuthAspect(RequirePermission/DataScope)platform数据EaEngine SqlBuilder Dialectmetadata异常GlobalExceptionHandler → Resultplatform上下文清理finally CurrentUser.clear() DataScope popplatform这就是16个模块在运行时的协作方式——不是所有请求都穿过所有模块而是按URL前缀路由到对应Controller公共能力认证/异常/EA数据访问横切所有链路。四、系列后续怎么展开这篇出现的每个环节后面各有一篇或几篇拆到底本篇环节后续文章EaEngine五步06篇引擎调度、07-08篇SqlBuilderDialect分页09-10篇8方言与ROWNUM演化postProcess加密脱敏14-15篇JwtAuthFilter九步25-26篇双令牌、黑名单CurrentUser29篇ThreadLocal上下文InterceptorChain41篇数据库配置的拦截器链事件推送43篇事务提交后WebSocket✅ 亮点用一查一改两条真实链路把16模块的运行时协作串起来每跳标注模块归属和源码文件——是整个系列的导航图。适合第一次接触多模块项目的人建立全局观。扩展方向后续每篇都是本文某一跳的代码级展开。

相关新闻

Docker部署翼龙面板前端:从环境准备到生产级配置全攻略

Docker部署翼龙面板前端:从环境准备到生产级配置全攻略

1. 为什么选择Docker部署翼龙面板前端?如果你正在管理一个游戏服务器,或者运营一个提供多用户游戏服务器托管服务的平台,那么Pterodactyl(翼龙面板)这个名字你大概率不会陌生。它是一个开源的、功能强大的游戏服务器管…

2026/8/23 22:34:07 阅读更多 →
让大模型思考,让小模型执行:在 Elastic Workflows 中拆分 LLM 成本

让大模型思考,让小模型执行:在 Elastic Workflows 中拆分 LLM 成本

作者:来自 Elastic Jeffrey Rengifo 构建一个 Elastic workflow,将数据样本发送给大模型,由大模型提出分类标签。人工审核确认后,再由小模型将这些标签应用于整个数据集。 将大语言模型(LLM)分类中昂贵的部…

2026/8/23 22:33:06 阅读更多 →
Agent开发 - 如何提高AI对ToolCalling工具调用准确率

Agent开发 - 如何提高AI对ToolCalling工具调用准确率

核心: 分为 【系统提示词systemText】 【用户提问userMessage】 和 【工具描述和参数描述】 三大部分。一、系统提示词systemText# 系统提示词 你拥有工具调用能力,请严格遵守下面全部规则: 1.意图判断:仔细分析用户问题,只有必须…

2026/8/23 22:33:06 阅读更多 →

最新新闻

Capture软件原理图PCB Footprint处理笔记

Capture软件原理图PCB Footprint处理笔记

Capture软件原理图PCB Footprint处理笔记前言一、 PCB Footprint属性在哪里?1.1 打开器件属性1.2 两种填写状态对比二、 如何根据器件型号查找PCB封装?2.1 IC类器件:型号 → Datasheet → 封装2.2 型号与封装的对应关系2.3 封装库匹配三、 无…

2026/8/24 13:09:09 阅读更多 →
AI多Agent协作系统实战(三十一):为了省token,我把1613行代码拆成了7个文件

AI多Agent协作系统实战(三十一):为了省token,我把1613行代码拆成了7个文件

系列第31篇 | 为了给一个71KB的单文件"减肥",我用AST写了拆楼机,拆完还验证它没散架背景:一个"不该拆"的文件 我们的任务监控脚本 task_monitor.py,是个1613行的庞然大物。 它干了什么?超时检测、…

2026/8/24 13:09:09 阅读更多 →
开源八字排盘引擎:JavaScript 实现四柱/大运/流年/合婚(附 1000 条断语库)

开源八字排盘引擎:JavaScript 实现四柱/大运/流年/合婚(附 1000 条断语库)

开源八字排盘引擎:JavaScript 实现四柱/大运/流年/合婚(附 1000 条断语库)关键词:八字排盘 开源 | 四柱八字 JavaScript | 农历转换 lunarToSolar | 节气精确切分 | 真太阳时校正 | 排盘引擎源码 项目地址:github.com/…

2026/8/24 13:09:09 阅读更多 →
关于后端技术选型,我有过一段反复纠结的经历

关于后端技术选型,我有过一段反复纠结的经历

会议室里剩我一个人的时候,白板上画满了箭头和方框,每个方框里都写着一个候选技术:Node.js、Go、Java、Python,旁边又延伸出PostgreSQL、MongoDB、Redis、Kafka……我像面对一盘永远下不完的棋,每走一步都在推翻自己。…

2026/8/24 13:09:09 阅读更多 →
手机酒馆 TauriTavern 夸克网盘下载「2026 最新版」|安卓直装 SillyTavern 客户端

手机酒馆 TauriTavern 夸克网盘下载「2026 最新版」|安卓直装 SillyTavern 客户端

一句话简介:TauriTavern(手机酒馆 / Tauri 酒馆)是开源项目 SillyTavern 的 Tauri 安卓客户端,整合角色卡、预设与扩展,开箱即用。本文提供夸克网盘高速下载地址与安装教程。 速览(太长不看) 是…

2026/8/24 13:09:09 阅读更多 →
风险清单批注:法务审一审之前的 AI 预筛怎么做

风险清单批注:法务审一审之前的 AI 预筛怎么做

法务审合同,真正值钱的动作是条款取舍和风险定级,但现实中大量时间耗在找错别字、核数字、查身份证号上。我们部门去年定了一条规矩:合同进法务手里之前,先过一遍机器预筛,输出一串批注;法务拿到文件第一眼…

2026/8/24 13:08:08 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →