Richfaces迁移至Primefaces时文件下载的FilterServletResponseWrapper替换问题
Primefaces迁移下ContentCachingResponseWrapper注入实现方案
实现步骤
- 新增自定义Servlet Filter,配置优先级高于Spring Security过滤链,确保响应包装逻辑先于框架默认包装执行
- Filter核心逻辑:匹配所有下载请求路由(可根据接口路径、请求头特征判断,也可全局生效),将原生
HttpServletResponse封装为ContentCachingResponseWrapper实例传入后续过滤链 - 过滤链执行完成后,显式调用
ContentCachingResponseWrapper的copyBodyToResponse()方法,将缓存的下载内容写回原始响应,避免返回空内容 - 调整Primefaces触发组件配置:给
p:commandLink添加ajax="false"属性,关闭AJAX提交,避免Primefaces AJAX响应处理器劫持下载流,导致自定义包装器逻辑失效 - 业务控制器内获取包装器时,可通过递归拆包的方式读取:循环判断当前响应对象是否为
ServletResponseWrapper子类,若是则调用getResponse()获取嵌套的内层响应,直到匹配到ContentCachingResponseWrapper类型,即可调用getContentInputStream()方法读取缓存的下载流
注意事项
若项目存在其他自定义响应包装逻辑,调整当前Filter的Order值为最小,确保
ContentCachingResponseWrapper处于包装器最外层,后续所有框架操作均基于该包装实例执行
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

