2012-01-24 131 views
2

如何編寫一個篩選器類以將響應從一個servlet傳遞到另一個以及GET參數?servlet鏈篩選器

這是什麼,我已經試過大綱(我得到了大部分來自this question

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> 

但它沒有不工作。它不會轉發到第二個servlet。我沒有調試環境設置,所以我不知道它失敗的位置,但有人能指出我正確的方向嗎?

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

無關到具體問題,如果我理解/猜測你的實際功能要求是正確的,你更想在/process servlet中尋找RequestDispatcher#include()。另請參見How do I execute multiple servlets in sequence?

+0

如果你看看原來的問題,以及我對這個問題的評論,你會注意到一些重要的細節已被省略...... – kschneid