Как исправить многократное включение ресурсов RichFaces в JBoss EAP 7.3.0?

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

Каким-то образом ресурсы для RichFaces теперь включаются несколько раз в сгенерированную HTML-разметку, что значительно замедляет загрузку пользовательского интерфейса. Теперь браузеру приходится обрабатывать множество ненужных запросов, что занимает несколько секунд при загрузке страницы.

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

Пример сгенерированного HTML

Я пока ничего не нашел...


person Daniel Bleisteiner    schedule 07.05.2020    source источник
comment
Я предполагаю, что вы уже проверили, включали ли вы банку RichFaces несколько раз. Или попробуйте на странице без PrimeFaces или проверьте наличие нескольких h:head или...   -  person Kukeltje    schedule 07.05.2020
comment
Конечно... это обрабатывается использованием в контексте JSF (<ui:composition> с используемыми компонентами), а не вручную. Этого не происходит с EAP 7.1.6, с которого я мигрирую.   -  person Daniel Bleisteiner    schedule 07.05.2020
comment
Количество включений, по-видимому, связано с количеством используемых компонентов на странице.   -  person Daniel Bleisteiner    schedule 07.05.2020
comment
...но не 1:1... один <rich:calendar> уже вызывает 10 включений. Но чем больше компонентов используется, тем выше число.   -  person Daniel Bleisteiner    schedule 07.05.2020
comment
Хорошее расследование. Создание минимально воспроизводимого примера уже показало бы это. Эффективно позволяет вам создать лучший заголовок (вы все еще можете улучшить его сейчас). И какой JSF использует JBoss EAP 7.3? Может быть, Richfaces не является «совместимым вперед», может быть, теперь вы даже можете найти дубликат или какую-то другую ссылку в Интернете.   -  person Kukeltje    schedule 07.05.2020
comment
stackoverflow.com/questions/23824219/ (похоже, что Richfaces делали какие-то странные вещи, которые могут больше не работать в более новых версиях JSF)   -  person Kukeltje    schedule 07.05.2020


Ответы (2)


Я реализовал фильтр сервлетов, чтобы исправить результирующий вывод 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: обертка через https://stackoverflow.com/a/23381235

person Daniel Bleisteiner    schedule 13.07.2020

Я заметил такое же поведение в своем старом приложении после обновления до JSF 2.3.9.

С Richfaces 4.5.17.Final вроде бы достаточно деактивировать оптимизацию ресурсов

(в веб.xml)

<context-param>
    <param-name>org.richfaces.resourceOptimization.enabled</param-name>
    <param-value>false</param-value>
</context-param>
  
person Christian Jansik    schedule 17.11.2020