2015-12-02 46 views
0

在我的用例中,我必須使用RequestDispatcher以將請求移除到部署在同一服務器上的另一個servlet。請求調度程序讀取包括之前的響應

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2) throws IOException, ServletException { 
    String generateRedirectUrl=FormURL((HttpServletRequest)req); 
    ServletContext context = ((HttpServletRequest)req).getSession().getServletContext(); 
    ServletContext newContext = context.getContext("/myNewContext"); 
    RequestDispatcher dispatcher = newContext.getRequestDispatcher(generateRedirectUrl); 
    dispatcher.forward(req, resp);   
} 

但我必須閱讀回覆,並在轉發前發送一些操作。

可能嗎?

+0

你是說,你要修改的是由servlet您生成響應正在將請求轉發給?什麼樣的修改? – mmulholl

+0

我必須讀取調度響應中的布爾值...然後我必須對其執行邏輯布爾操作,最後我必須重寫被轉發給客戶端的響應中的布爾結果。 – Alex

+0

轉發的servlet使用寫入器還是輸出流?將嘗試拿出代碼示例來演示。 – mmulholl

回答

0

如果您創建servletContextListener,則可以使用它來添加作爲轉發請求的一部分運行的新過濾器。然後,您可以實現一個覆蓋getPrintWriter()和getOutputStream()方法的HttpServletResponseWrapper,以返回您自己的基本緩衝所寫內容的對象,然後在您的新過濾器中調用doChain()之前用您的包裝器替換響應對象。然後從doChain返回時,您從緩衝區中獲取響應數據,按照您的喜好進行處理,然後使用PrintWriter或OutputStream(其餘請求使用哪一個)將其寫出。我懷疑剩下的服務將使用PrintWriter進行輸出,因此這將成爲您採用的路線。

這裏有一個如何做到這一點(減去了ServletContextListener)很好的例子:

http://www.java2s.com/Tutorial/Java/0400__Servlet/Filterthatusesaresponsewrappertoconvertalloutputtouppercase.htm

如果這個例子爲大寫的響應轉換是你尋找json的名稱,值一對您需要更改並根據需要進行修改。

這裏是一個合適的ServletContextListener的例子。需要注意的是,聽衆需要添加,使得它被稱爲所有的應用程序和不同的服務器的實現提供了這樣做的不同的方法:

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 

    @WebListener 
    public class ServletContextListenerFilter implements ServletContextListener { 

     public ServletContextListenerFilter() {} 

     @Override 
     public void contextDestroyed(ServletContextEvent arg0) {} 

     @Override 
     public void contextInitialized(ServletContextEvent sce) { 
      ServletContext sc = sce.getServletContext(); 

      if (sc.getServletContextName().equals("Third party rest serice context name")) { 
       sc.addFilter("FilterName", filterClass); 
      } 

     } 
    } 
+0

對不起,這個解決方案只有在過濾器運行在轉發的請求上,但你的過濾器執行了轉發請求時纔有效。需要更復雜的解決方案。 – mmulholl

相關問題