尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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模块的运行时协作串起来每跳标注模块归属和源码文件——是整个系列的导航图。适合第一次接触多模块项目的人建立全局观。扩展方向后续每篇都是本文某一跳的代码级展开。
RELATED

相关推荐

论文一键降重白扔三百还越改越乱?按查重报告定向降重才是真解法

论文一键降重白扔三百还越改越乱?按查重报告定向降重才是真解法

论文降重时,最危险的操作往往不是“不改”,而是你为了省心,把整篇论文丢进“一键降重”。 这是我去年踩过最结实的一个坑。当时初稿查重率 27.8%,学校要求 15% 以下。我嫌对着报告逐句改太麻烦,就找了个号称“全文智能…

📅 2026/10/19 11:50:19
python的运筹学工业场景模拟第八十七篇:读取管网台账,提取每条管道最大流量,清洗废弃管道,构建网络最大流模型参数。

python的运筹学工业场景模拟第八十七篇:读取管网台账,提取每条管道最大流量,清洗废弃管道,构建网络最大流模型参数。

管网“疏通器”:用Python清洗废弃管线,给最大流模型造“干净拓扑”“某化工园区有 87 条工艺管道、12 个关键节点,每月做一次管网输配能力评估。计划员花 2 天手工整理管网台账、剔除废弃管线、核对每条管的最大流量,再手动录入最…

📅 2026/11/11 12:53:39
推荐几家做草花靠谱的供应商

推荐几家做草花靠谱的供应商

引言在园林景观、城市绿化等众多场景中,草花凭借其绚丽多彩的花色、丰富的品种以及较强的适应性,占据着重要地位。选择一家靠谱的草花供应商至关重要,它能为项目的成功提供有力保障。接下来为大家推荐几家在行业内比较靠谱的草花供应商。地邦…

📅 2026/11/8 16:27:00
MORE NEWS

更多资讯

📰

宜昌电工证有补贴吗?学历不高怕报不上名?良心建议来了!

宜昌电工证有补贴吗?学历不高怕报不上名?良心建议来了! 你是不是也担心自己学历不高,考不了电工证?别急,我来给你说说真实情况,帮你把关,少走弯路。…

📰

汕尾哪里报考电工证?外省证能转吗?考前押题帮你稳过

汕尾哪里报考电工证?外省证能转吗?考前押题帮你稳过 之前考的证在外省能不能转过来?这是很多在外地打工的电工朋友最关心的问题。汕尾这边的电工证报考流程其实并不复杂,但如果你是第一次接触,或者你的证是在别省考的,那得提前了解清楚。今天我们就来聊…

📰

潢川考电工证有补贴吗 电工证含金量到底有多高

潢川考电工证有补贴吗 电工证含金量到底有多高 证书过期了不知道怎么复审延期?我同事老王就因为这个问题差点丢了饭碗。他是新乡市某水利工程单位的电工,之前一直在工地负责设备维护和线路安装,没想到电工证过期了他压根没注意,结果去年单位检查时被通报…

📰

电工证属于E类人才吗良心建议帮你搞懂实操考试怕挂科怎么办

电工证属于E类人才吗良心建议帮你搞懂实操考试怕挂科怎么办 实操考试心里没底怕挂科,这是很多正在准备电工证考试的小伙伴的真实写照。面对高压电、复杂线路和各种仪器设备,一不小心就可能操作失误,影响考试成绩。但别急,今天就给你 良心建议…

📰

宜昌电工证有补贴吗?郑州报考避坑指南全攻略

宜昌电工证有补贴吗?郑州报考避坑指南全攻略 不知道去哪报名怕被中介坑,宜昌电工证有补贴吗?这个问题是很多准备考电工证的朋友最先考虑的。尤其是像你这样在济源市政公用工程行业工作的朋友,考证不仅关系到能不能上岗,还可能影响你未来的薪资和职业发展…

📰

高压可以考电工证题库网上查询怎么操作?新乡电工证报名攻略全解析

高压可以考电工证题库网上查询怎么操作?新乡电工证报名攻略全解析 你是不是正为 急需特种作业证才能上岗找工作 而发愁?特别是 高压电工证 ,现在几乎每个工地、电力施工项目都要求持证上岗,连面试都过不了。别急,今天就从 高压可以考电工证题库…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬