Фильтр сервлета, заставляющий изображение не отображаться на клиенте - PullRequest
2 голосов
/ 29 марта 2012

У меня есть сервлет-фильтр, который фильтрует запрос от сервлета. Я не хочу что-то делать по запросу на изображение, поэтому у меня есть, например, этот код:

if (baseURL.endsWith("png")) 
{
 chain.doFilter(servletrequest, servletresponse);
}

Что касается метода фильтра doFilter, я ничего не делаю и просто вызываю chain.doFilter, я ожидал, что ответное изображение будет правильно отправлено клиенту, однако возвращаемое Content-Type "application/octet-stream" вместо "image/png"

Есть идеи, почему это происходит?

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

У меня есть сервлет-фильтр, который фильтрует запрос от сервлета.Я не хочу что-то делать по запросу для изображения

FilterChain#doFilter() не предотвращает попадание запроса в ваш сервлет, если его шаблон URL также соответствует URL запроса.Вы, кажется, думаете, что это так.Таким образом, это неверно.

Если вы не хотите, чтобы запросы на изображения попадали в ваш сервлет, вам необходимо сопоставить сервлет с более конкретным шаблоном URL.Например, /app/* вместо /*.Затем вы можете отфильтровать запросы следующим образом:

if (httpServletRequest.getRequestURI().endsWith(".png")) {
    chain.doFilter(request, response);
}
else {
    request.getRequestDispatcher("/app" + httpServletRequest.getRequestURI()).forward(request, response);
}

Шаблон URL /* следует использовать не для сервлетов, а только для фильтров.

Кроме того, тип содержимого определяетсязначение по умолчанию уже определено автоматически в зависимости от расширения файла.Я предполагаю, что у вас действительно есть ресурс some.png, а не ресурс somepng, так как первоначальное значение аргумента endsWith() также будет соответствовать.

См. Также:

1 голос
/ 29 марта 2012

Вы должны выйти из цепочки фильтров и установить тип контента:

    if(baseURL.endsWith("png")) {
        response.setContentType("image/png");
    } else {
        chain.doFilter(request, response);
    }
1 голос
/ 29 марта 2012

пут return; выписка

if (baseURL.endsWith("png")) 
{
 chain.doFilter(servletrequest, servletresponse);
 return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...