如何修复 JBoss EAP 7.3.0 多次包含 RichFaces 的资源?

How to fix RichFaces' resources being included multiple times with JBoss EAP 7.3.0?

我目前正在从 JBoss EAP 7.1 迁移到 7.3,我的一个问题与 RichFaces – v4.5.17 已停产很长时间 – 我知道。但无论如何,我现在需要处理这个问题。

RichFaces 的资源现在以某种方式多次包含在生成的 HTML 标记中,这显着延迟了 UI 的加载。浏览器现在必须处理多个不必要的请求,这些请求在加载页面时需要几秒钟。

除了完全放弃 RichFaces 之外,是否有解决此问题的任何已知解决方案

到目前为止我找不到任何东西...

我已经实现了 Servlet 过滤器 以在将结果 HTML 输出移交给客户端之前修复它。它 完全删除 <link><script> 元素的所有重复项 – 不仅限于这些特定的 RichFaces 嵌入。

public class RichFacesDuplicatesFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        // Ignore resources...
        final String path = ((HttpServletRequest) request).getServletPath();
        if (path.startsWith("/javax.faces.resource")) {
            chain.doFilter(request, response);
            return;
        }

        // Wrapper via 
        CapturingResponseWrapper wrapper = new CapturingResponseWrapper((HttpServletResponse) response);
        chain.doFilter(request, wrapper);

        String content = wrapper.getCaptureAsString();
        content = this.removeDuplicates(content, "<link [^>]+\/>");
        content = this.removeDuplicates(content, "<script [^>]+><\/script>");

        response.getWriter().write(content);
    }

    private String removeDuplicates(String content, String regex) {
        int     index   = 0;
        Pattern pattern = Pattern.compile(regex, Pattern.DOTALL | Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find(index)) {
            index = matcher.end();
            content = content.substring(0, index) 
                    + content.substring(index).replace(matcher.group(), "");
            matcher = pattern.matcher(content);
        }
        return content;
    }
}

这会为每个请求增加(非常)少的开销并暂时解决该问题。我们希望将来完全摆脱 RichFaces。

PS:包装器来自

我注意到在升级到 JSF 2.3.9 后我的“旧”应用程序中出现了同样的行为。

使用 Richfaces 4.5。17.Final 停用资源优化似乎就足够了

(在web.xml)

<context-param>
    <param-name>org.richfaces.resourceOptimization.enabled</param-name>
    <param-value>false</param-value>
</context-param>