Как исправить многократное включение ресурсов RichFaces в JBoss EAP 7.3.0? - PullRequest
0 голосов
/ 07 мая 2020

Я перехожу с JBoss EAP 7.1 на 7.3 в настоящий момент, и одна из моих проблем связана с RichFaces , который является EOL с v4.5.17 в течение очень долгого времени - Я знаю. Но, тем не менее, мне нужно справиться с этим на данный момент. Теперь браузер должен обрабатывать несколько ненужных запросов, что занимает несколько секунд при загрузке страницы.

Есть ли какое-либо известное решение этой проблемы, кроме полного отказа от RichFaces?

Example of generated HTML

Пока ничего не нашел ...

1 Ответ

0 голосов
/ 13 июля 2020

Я реализовал Фильтр сервлетов , чтобы исправить полученный результат 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 { ссылка }

...