如何修复 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>
我目前正在从 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>