фильтр цепочки сервлетов - PullRequest
2 голосов
/ 24 января 2012

Как я могу написать класс фильтра для передачи ответа от одного сервлета к другому вместе с параметрами GET?

Это набросок того, что я пробовал (я получил большую часть из этого вопроса )

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TranslateFilter implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException {

    chain.doFilter(request, response);
    ..

    RequestDispatcher dispatch = request.getRequestDispatcher("/Translate");
    dispatch.forward(request, response); 
    ..
  }
}

и это в web.xml

<servlet-mapping>
    <servlet-name>process</servlet-name>
    <url-pattern>/Process
</servlet-mapping>

<servlet-mapping>
    <servlet-name>translate</servlet-name>
    <url-pattern>/Translate
</servlet-mapping>

<filter-mapping>
    <filter-name>processChain</filter-name>
    <servlet-name>process</servlet-name>
</filter-mapping>

Но это не работает.Это не переадресация на второй сервлет.У меня нет настройки среды отладки, поэтому я не могу сказать, где она выходит из строя, но может ли кто-нибудь указать мне правильное направление?

1 Ответ

9 голосов
/ 24 января 2012

FilterChain#doFilter() продолжает обработку запроса и возвращается только после того, как целевые контроллеры завершили свою работу и ответ был обработан и зафиксирован.

Вы должны не вызывать его, если вы намереваетесь изменить запрос на другой адрес на стороне сервера на RequestDispatcher#forward() (или если вы хотите, чтобы клиентская сторона отправила новый запрос на HttpServletResponse#sendRedirect() ). Вы должны были заметить это, увидев IllegalStateException: response already committed в журналах сервера.

Так что, либо удалите его так, чтобы у вас получился только форвард,

request.getRequestDispatcher("/Translate").forward(request, response); 

или сделайте его условным

if (someCondition) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/Translate").forward(request, response); 
}

Не имеет отношения к конкретному вопросу, если я правильно понимаю / угадаю ваше действительное функциональное требование, вы больше ищете RequestDispatcher#include() в сервлете /process. См. Также Как последовательно выполнять несколько сервлетов?

...