2013-10-01 2 views
1

Мой фильтр должен редактировать HTML-ответ. Но когда я перейти к странице, это не делает ничего, потому чтоФильтр сервлета настаивает на отсутствии текста ответа

newResponse.toString(); 

возвращается null.

Далее отладка показывает, что в рамках этого toString метода writer является null

Вот раздел, который, как представляется, проблема:

public ServletOutputStream getOutputStream() throws IOException { 
    if (getWriterCalled) { 
     throw new IllegalStateException("getWriter already called"); 
    } 

    getOutputStreamCalled = true; 
    return super.getOutputStream(); 
    } 

    public PrintWriter getWriter() throws IOException { 
    if (writer != null) { 
     return writer; 
    } 
    if (getOutputStreamCalled) { 
     throw new IllegalStateException("getOutputStream already called"); 
    } 
    getWriterCalled = true; 
    writer = new PrintWriter(charWriter); 
    return writer; 
    } 

    public String toString() { 
    String s = null; 

    if (writer != null) { 
     s = charWriter.toString(); 
    } 
    return s; 
    } 
} 

Полный код здесь:

Filter that uses a response wrapper to convert all output to uppercase

+1

Вы завернули 'Writer', но не' OutputStream'. Ваш сервлет, вероятно, записывается непосредственно в 'OutputStream'. Используйте отладчик. –

ответ

1

Насколько я знаю, цепочка фильтров сервлетов вызывается по протоколу HTTP запрос до достигает адресата (например, сервлет). Когда вы используете фильтр для получения контента, который создается точкой назначения запроса, вы получаете null, потому что он будет существовать только в будущем. Но есть адекватное решение, упомянутое в документах (http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html). Просто сделайте так, чтобы ваша обертка ответа украсила доступ к содержимому HttpServletResponse. Например - переопределите автора по умолчанию с вашим обычаем, который будет определять буквы и заглавные буквы при его методе write().

+0

Я посмотрел на эту ссылку, но я не вижу решения, которое вы упомянули. – ColBeseder

+0

Было предложение «3. Опционально оберните объект ответа с помощью специальной реализации для фильтрации содержимого или заголовков для фильтрации вывода» в описании doFilter(). Я просто попытался развить эту идею. На самом деле подумайте о переопределении/цепочке ввода или вывода. –

+0

Спасибо. Оказывается, моя проблема была намного проще. Но ссылка была полезна в любом случае. – ColBeseder

0

Страница, которую я пыталась фильтровать, была index.html.

Похоже, что фильтр может редактировать только ответ для страницы, заканчивающейся в .jsp.

+0

Это только вопрос исправления шаблона URL-адреса в картировании фильтра. – BalusC

+0

@BalusC В настоящее время url-шаблон установлен в '/ *'. Почему это принимает только файлы .jsp? – ColBeseder

Смежные вопросы