2013-09-29 2 views
0

Сводная задача: изменение заголовка «Content-type» в HttpServletResponse на «image/svg + xml» дает мне пустой ответ с надписью «Content-length», 0 "в моем браузере.Ширина разрешения Java HttpServletResponse Content-Length при смене другого заголовка

Полное описание:

Я работаю с плагином CMS (в Java), которые используют HttpServletRequest и HttpServletResponse. Существует проблема с возвратом CMS «application/octet-stream» на запросы к файлам .svg.

Плагин, над которым я работаю, - это сервлет, который перехватывает все пары «запрос-ответ» (сопоставление определенного шаблона URL-адресов с папками изображений). Затем я проверяю, содержит ли строка запроса «.svg», а затем изменит Content-Type на «image/svg + xml» в ответе (из «application/octet-stream»).

Но когда я меняю тип контента; Заголовок Content-length равен 0, и браузер ничего не отображает. Я теряю содержимое после изменения заголовка другими словами.

Есть ли способ, по которому я могу изменить только один заголовок, не записывая содержимое изображения в ответ? (ServletOutputStream).

Я придумал одно решение; который выполняет дополнительный запрос HttpGet (в плагине) к соответствующему svg-изображению, прежде чем записывать его в ответ от InputStream, но я думаю, что это слишком дорого для каждого запроса svg на зараженном сервере.

Если бы я мог уйти с изменением заголовка, не выполняя лишних операций ввода-вывода.

ответ

0

Если ваш плагин был Filter вместо сервлета (может быть, ваша структура позволяет фильтр плагинов?), То вы можете обернуть объект ответа в HttpServletResponseWraper перед прохождением обработки вдоль и обертка может сохранить содержимое в какой-то поток в вместо записи в поток ответов. И затем, когда обработка завершена, вы должны установить заголовок, получить содержимое, которое было записано в память, и передать его в ответ.

На второй взгляд: вам даже не нужно определять этот фильтр на уровне фрейма. Если у вас есть доступ и вы можете свободно изменять web.xml вашего приложения, вы можете легко снять его с простого старого фильтра Java EE.

В любом случае, я не понимаю, почему установка типа содержимого приведет к сбросу содержимого. В документации ServletResponse.setContentType ничего не говорится об этом.

+0

Это действительно так просто, как вызвать 'ServletResponse.setContentType'. Это как если бы ответ сбрасывался после этого. Я пробовал 'close()' и 'flush()' на 'OutputStream', но не повезло. На самом деле заголовок 'Content-length' не появляется после вызова' flush() '.. Реализация CMS Filter разрешает только редактирование разметки HTML (без доступа к объекту ответа там). – gorn

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