You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:12:49