如何在Enonic中通过HTTP过滤器获取POST请求数据
Enonic平台全局统一处理POST请求的实现方案
完全可以实现无单独控制器的全局POST请求统一处理,也完全可以借助HTTP过滤器完成POST请求拦截和数据获取,具体实现逻辑如下:
- 先澄清常见误区:Enonic的HTTP过滤器不存在“仅支持GET请求”的限制,它默认会拦截所有匹配配置路径规则的全类型HTTP请求。大家产生“只支持GET”的误解,大多是因为入门示例代码通常只演示了GET请求的参数解析逻辑,没有覆盖POST请求的请求体读取流程。
- 具体实现步骤:
- 注册全局过滤器:在应用的
site.xml配置中注册一个请求过滤器,将路径匹配规则设置为/*覆盖全站,调整过滤器优先级到业务控制器之前执行,保证请求最先进入过滤器逻辑。 - 请求方法判断:在过滤器逻辑里先读取
request.method字段,识别到POST请求时就进入统一处理分支,不需要再路由到单独编写的POST控制器。 - POST数据读取:直接从请求对象里读取请求体即可,根据
Content-Type请求头选择对应的解析方式:application/json类型:直接读取request.body.text做JSON反序列化拿到参数application/x-www-form-urlencoded类型:直接读取内置解析好的request.body.form拿到表单键值对multipart/form-data类型:从request.body.form拿普通表单字段,从request.body.files拿上传的文件对象
- 特殊请求放行:如果有少量POST请求需要走定制化逻辑,只要在过滤器里加路径白名单,匹配到对应路径直接调用
next(req)放行到原有控制器即可,不会影响特殊业务运行。
- 注册全局过滤器:在应用的
实操踩坑提示:请求体的输入流默认只能读取一次,如果你的过滤器读取完POST数据后还需要放行请求给后续控制器处理,一定要把解析完成的POST数据存到
request的自定义属性里再往下传,避免后续逻辑拿到空的请求流。
核心实现代码参考:
// 全局POST统一处理过滤器 exports.filter = function (req, next) { if (req.method === 'POST') { // 配置需要放行的特殊POST路径白名单 const postWhiteList = ['/payment/notify', '/file/upload/special']; const needPass = postWhiteList.some(path => req.path.startsWith(path)); if (needPass) { // 提前解析POST数据塞到上下文,避免后续控制器读不到流 req.customPostData = parsePostData(req); return next(req); } // 统一处理普通POST请求 const postData = parsePostData(req); // 此处可添加统一逻辑:参数校验、日志埋点、权限校验、响应封装等 return { status: 200, contentType: 'application/json', body: JSON.stringify({ code: 0, data: postData, message: 'request processed by global POST handler' }) }; } // 非POST请求直接放行 return next(req); }; // 抽离的POST数据解析工具函数 function parsePostData(req) { const contentType = req.headers['content-type'] || ''; if (contentType.includes('application/json')) { return JSON.parse(req.body.text || '{}'); } if (contentType.includes('multipart/form-data')) { return { formFields: req.body.form, uploadFiles: req.body.files }; } // 默认返回urlencoded格式解析结果 return req.body.form || {}; }
内容的提问来源于stack exchange,提问作者Madhurshani Sivan
相关产品推荐
相关产品推荐

