迁移至Jakarta EE10后PrimeFaces原生上传与OCPSoft Rewrite兼容问题
解决方案:通过OCPSoft Rewrite配置放行PrimeFaces原生上传请求
不用修改所有页面的JavaScript,直接从Rewrite的规则配置入手,让它跳过PrimeFaces原生上传的请求即可,以下是几种可行方案:
1. 添加全局Rewrite规则排除上传请求
创建Rewrite的配置类,针对PrimeFaces原生上传的特征设置放行规则:
@RewriteConfiguration public class AppRewriteConfig extends HttpConfigurationProvider { @Override public Configuration getConfiguration(ServletContext servletContext) { return ConfigurationBuilder.begin() // 放行带有PrimeFaces上传标识参数的请求 .addRule() .when(Direction.isInbound().and(RequestParameter.exists("primefaces_upload"))) .perform(HandledBy.passThrough()) // 同时放行非AJAX的表单提交请求(原生上传为普通表单提交) .addRule() .when(Direction.isInbound() .and(Path.matches("/.*\\.xhtml")) .and(QueryParam.exists("javax.faces.partial.ajax").not())) .perform(HandledBy.passThrough()); } }
PrimeFaces原生上传发起的请求会自动携带primefaces_upload参数,通过这个规则可以让Rewrite直接放行该请求,不做路由拦截,确保请求能正常传递到后端Bean。
2. 在URL映射中添加条件跳过上传请求
如果你的@URLMapping是针对特定页面的,可以给映射添加条件,当请求带有上传参数时跳过该映射:
@URLMapping( id = "userProfileMapping", pattern = "/user/profile", viewId = "/userProfile.xhtml", conditions = { @Condition(value = "${!param.primefaces_upload}", name = "excludeUploadRequests") } )
这样当用户在该页面发起上传请求时,Rewrite不会应用这个映射规则,请求直接流向页面对应的Bean处理。
3. 自定义PrimeFaces上传路径并排除
通过PrimeFaces配置指定专属的上传处理路径,再让Rewrite排除该路径:
首先在web.xml中添加配置:
<context-param> <param-name>primefaces.UPLOAD_SERVLET_URL</param-name> <param-value>/app-upload-handler</param-value> </context-param>
然后在Rewrite配置中放行这个路径:
.addRule() .when(Direction.isInbound().and(Path.matches("/app-upload-handler"))) .perform(HandledBy.passThrough());
这种方式让上传请求直接指向PrimeFaces的上传处理端点,完全避开Rewrite的路由逻辑。
注意事项
- 确保使用的OCPSoft Rewrite版本是7.0.0及以上,该版本完全兼容Jakarta EE 10的命名空间
- 可以开启Rewrite的调试日志(设置
org.ocpsoft.rewrite日志级别为DEBUG),验证规则是否正确拦截/放行目标请求
内容的提问来源于stack exchange,提问作者Marco Tedesco
相关产品推荐
相关产品推荐

