Я на самом деле довольно новичок в спецификациях Java EE, так как я отчасти молод. Я никогда не узнавал об этом в школе, и я столкнулся с странным поведением с помощью метода doFilter
.Возможное непонимание метода doFilter
Рассмотрит следующий фильтр:
@WebFilter(filterName = "URLFilter", value = "/test")
public class URLFilter implements Filter {
public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletResponse response = (HttpServletResponse) resp;
if (response.getStatus() == HttpServletResponse.SC_NOT_FOUND)
response.sendRedirect("/");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {}
}
Там нет сервлета или страницы присутствует в /test
и в моем браузере, статус, очевидно, 404 not found
ошибки при доступе к URL и так должно быть значение, возвращенным мне по методу getStatus()
, который нет. (фактически с кодом состояния 200
)
Почему мой фильтр не перенаправляет меня на /
в соответствии с запросом? Не понимаю ли я использование Filters
в целом?
UPDATE:
Моего вопроса был о перенаправлении клиента (с помощью sendRedirect()
), когда страница не найдена. Я не понял часть фильтра, потому что я не знал, что resp
и req
фактически заполнены новыми данными, когда вызывается chain.doFilter()
. (что я действительно нашел странным, так как doFilter вызывает следующий фильтр, привязанный по шаблону COR)
Я создал класс, наследующий HttpServletResponseWrapper
, внедрил его, передал его фильтру и теперь он отлично работает.
Таким образом, единственной целью или фильтрами здесь является модификация запросов/ответов перед подачей фактических ресурсов. – MadJlzz
Нет. Вы также можете делать вещи * после * вызова chain.doFilter(). –
Да, но потом мой ответ наступает, и я не могу сделать что-то вроде 'sendRedirect()'. Я думаю, у меня нет выбора, кроме как сделать оболочку для управления тем, что я хочу. – MadJlzz