Как добавить заголовки ответа на основе Content-type; получение Content-type до того, как ответ будет принят - PullRequest
8 голосов
/ 02 апреля 2010

Я хочу установить заголовок Expires для всех image/* и text/css. Я делаю это в Filter. Тем не менее:

  • перед вызовом chain.doFilter(..) Тип контента еще не "реализован"
  • после вызова chain.doFilter(..) установлен тип контента, но также и длина контента, что запрещает добавление новых заголовков (по крайней мере, в реализации Tomcat)

Я могу использовать расширения запрошенного ресурса, но так как некоторые из файлов css генерируются richfaces путем извлечения их из jar-файлов, имя файла не x.css, а /xx/yy/zz.xcss/DATB/... .

Итак, есть ли способ получить Content-type до того, как ответ будет зафиксирован.

Ответы [ 2 ]

13 голосов
/ 02 апреля 2010

Да, внедрить HttpServletResponseWrapper и переопределить setContentType().

class AddExpiresHeader extends HttpServletResponseWrapper {
    private static final long ONE_WEEK_IN_MILLIS = 604800000L;

    public AddExpiresHeader(HttpServletResponse response) {
        super(response);
    }

    public void setContentType(String type) {
        if (type.startsWith("text") || type.startsWith("image")) {
            super.setDateHeader("Expires", System.currentTimeMillis() + ONE_WEEK_IN_MILLIS);
        }
        super.setContentType(type);
    }
}

и используйте его следующим образом:

chain.doFilter(request, new AddExpiresHeader((HttpServletResponse) response));
2 голосов
/ 02 апреля 2010

Вы должны создать подкласс HttpServletResponseWrapper и переопределить addHeader и setHeader , чтобы добавить новый требуемый заголовок, когда «Content-Type» передается в качестве имени заголовка.Убедитесь, что не забыли также вызывать super в этих переопределенных методах.Оберните ответ, отправленный в аргументе метода doFilter, с помощью этого нового Wrapper и передайте Wrapper вызову doFilter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...