HttpServletResponse тип содержимого null при обнаружении HTML-файла - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь реализовать фильтр сервлетов Java, который изменяет ответы html.

doFilter метод моего класса фильтра выглядит так:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (filterConfig == null) {
        return;
    }

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String contentType = res.getContentType();

    if (contentType != null && contentType.contains("text/html")) {
        chain.doFilter(req, res);
        // do some modification
    } 
}

Для каждого ответа I 'Я пытаюсь понять, если это HTML. Если это так, я делаю некоторые изменения, но у меня возникает следующая проблема: При запросе файла jsf res.getContentType() возвращает null (res.getHeader("Content-Type") также возвращает null). В инструментах разработчика моего браузера я вижу, что заголовок 'Content-Type' имеет значение 'text / html;charset = UTF-8 ', но почему res.getContentType() возвращает null в этом случае?

Есть ли другой способ обнаружить ответ HTML в фильтре?

РЕДАКТИРОВАТЬ Я добавилchain.doFilter(req, res) вызов в условии if.

enter image description here

1 Ответ

0 голосов
/ 06 ноября 2019

Поскольку JSF использует сервлет , вы можете проверять только то содержимое, которое оно сгенерировало после цепочки (кажется, вы ожидаете, что оно выполнено до вашего фильтра, но это не так). Причина этого заключается в том, что вся цепочка фильтров всегда выполняется до , а сервлеты всегда см.

Это означает, что в вашем doFilter(...) вы можете получить доступ только к ответам, если получите к нему доступ после chain.doFilter(..) в вашем коде, как видно из первой ссылки.

Таким образом, если фильтр не создает контент (который не должен быть iirc, по крайней мере реальный контент), тип контента в ответе будет всегда равным нулю передchain.doFilter() вызывается (если только фильтр не создал ответ на ошибку аутентификации / авторизации).

Эффективно ваш код выполняет

String a=null;
if (a != null || or a.equals("b") {
   doThing();
}

Следовательно, кажется, у вас есть http://www.xyproblem.info, и поэтому вы должны переосмыслить свой дизайн. (чего ты пытаешься достичь)

...