2016-10-19 4 views
-1

Я на самом деле довольно новичок в спецификациях 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, внедрил его, передал его фильтру и теперь он отлично работает.

ответ

1

Ваш фильтр вызывается перед попыткой доступа к фактическому ресурсу (сервлет, страница, файл, что угодно), расположенный по адресу /test. Таким образом, статус ответа не может быть 404 еще в это время.

Затем ваш фильтр вызывает chain.doFilter(), тем самым указывая контейнеру на фактическое обслуживание ресурса по адресу /test. Поскольку такого ресурса нет, вы получаете 404.

+0

Таким образом, единственной целью или фильтрами здесь является модификация запросов/ответов перед подачей фактических ресурсов. – MadJlzz

+0

Нет. Вы также можете делать вещи * после * вызова chain.doFilter(). –

+0

Да, но потом мой ответ наступает, и я не могу сделать что-то вроде 'sendRedirect()'. Я думаю, у меня нет выбора, кроме как сделать оболочку для управления тем, что я хочу. – MadJlzz

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

  • Нет связанных вопросов^_^