2012-01-24 4 views
2

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); 
    .. 
    } 
} 

(나는 this question에서의 대부분을 가지고)이를 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> 

에 그러나 그렇지 않습니다하지 작업. 두 번째 서블릿으로 전달하지 않습니다. 디버깅 환경 설정이 없으므로 어디에서 실패했는지 알 수 없지만 누군가가 올바른 방향으로 나를 가리킬 수 있습니까?

+0

'chain.doFilter (request, response);'는이 조건입니까? –

+0

@ JigarJoshi가 부울을 반환하는지 묻는 중입니까? –

+0

원래 질문의 일부로 게시하지 않는 이유는 무엇입니까? 필자가 제공 한 대답의 중요한 세부 사항을 생략했습니다. 즉, 원래 응답 객체 대신 버퍼로 작동하는 응답 래퍼를 전달해야합니다. – kschneid

답변

8

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()을 더 찾고 있습니다. 또한보십시오 How do I execute multiple servlets in sequence?

+0

원래 질문과이 질문에 대한 내 의견을 보면 몇 가지 중요한 세부 사항이 생략되었음을 알 수 있습니다 ... – kschneid

관련 문제