Я реализовал Фильтр сервлетов , чтобы исправить полученный результат 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 https://stackoverflow.com/a/23381235
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: Wrapper via { ссылка }