Это зависит от того, что вы хотите.В целом, ваш образец не является правильным, хотя.После возвращения chain.doFilter
уже слишком поздно что-либо делать с ответом.На этом этапе весь ответ уже был отправлен клиенту, и ваш код не имеет к нему доступа.
Что вам нужно сделать, это обернуть request
и / или response
в ваши собственные классы, передатьэти обертки в методе doFilter
и обрабатывают любую обработку в ваших обертках.
Для упрощения, уже есть обертки, доступные в сервлете api: см. HttpServletRequestWrapper
и HttpServletResponseWrapper
классы.Если вы хотите обработать выходные данные, которые фактически отправляются клиенту, вам также нужно написать собственные оболочки OutputStream или Writer и вернуть их из вашей оболочки HttpServletResponse.Да, много переносов:)
Некоторые более простые фильтры могут работать без переноса запроса или ответа: например, перед вызовом doFilter
, вы уже можете получить доступ к заголовкам запроса или вы можете отправить пользовательский ответ без вызова doFilter
.Но если вы хотите обработать тело запроса, вы не можете просто прочитать его, иначе оно не будет доступно для остальной части цепочки.В этом случае вам нужно снова использовать технику упаковки.