2015-02-24 52 views
0

我試圖實現一個異步servlet,它將接收最終用戶的請求,將它傳遞到後端服務器並獲取響應。如何修改使用異步servlet的代理響應?

到目前爲止,這聽起來像是Jetty的一個非常標準的應用程序ProxyServlet

現在,我的後端會用include語句(有點像Server-Side-Includes)來響應,我需要解析它,查詢後端並在最終用戶的響應流的適當位置插入。

你將如何去實現這個?我特別好奇在onResponseContent回調期間解析和解僱中間請求,我知道這可能包含也可能不包含完整響應(因此可能只包含include語句的一部分)。

爲了說明,這裏就是我目前有:

@WebServlet(name = "MyServlet", 
     urlPatterns = {"/my/outbounduri/*"}, 
     initParams = { 
       @WebInitParam(name = "proxyTo", value = "/servlet/backend") 
     } 
) 
public class MyHandler extends ProxyServlet { 
    @Override 
    protected void customizeProxyRequest(HttpServletRequest srequest, 
      HttpServletResponse sresponse) { 
     // add custom headers for the backend 
    } 

    @Override 
    protected void onResponseContent(HttpServletRequest request, 
      HttpServletResponse response, Response proxyResponse, 
      byte[] buffer, int offset, int length, Callback callback) { 
     try { 
      // instead of passing the content on, we need to catch 
      // include statements 
      // response.getOutputStream().write(buffer, offset, length); 
      callback.succeeded(); 
     } catch (Throwable x) { 
      callback.failed(x); 
     } 
    } 

    @Override 
    protected void onResponseSuccess(HttpServletRequest request, 
      HttpServletResponse response, Response proxyResponse) { 
     AsyncContext asyncContext = request.getAsyncContext(); 
     asyncContext.complete(); 
    } 
} 

回答

4

如果要修改的內容的代理中的內容,然後用碼頭9.2.8.v20150217及其新org.eclipse.jetty.proxy.AsyncMiddleManServlet

注意:這是全新的功能,並且在實現中必然會出現一些瑕疵。

這是一個專門的AsyncProxyServlet,旨在簡化從客戶端修改請求內容和/或從遠程服務器響應內容的複雜性。 (這是特別複雜,當代理的2面具有不同的傳輸編碼)

在您的使用情況下,開始與壓倒一切的AsyncMiddleManServlet.newServerResponseContentTransformer(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse),並使其返回你的設計的ContentTransformer已經做了你所需要的邏輯的一個新實例對於這種轉變。

實現自己ContentTransformer該做的事情需要在.transform(ByteBuffer input, boolean finished, List<ByteBuffer> output)

做讀什麼你可以從input,一旦你有東西可寫,做一個output.add(modified)。請注意0​​標誌,因爲這可讓您知道何時收到最後一位輸入內容。其他說明中,如果需要控制從客戶端請求端到遠程服務器端的URL差異,請覆蓋String rewriteTarget(HttpServletRequest clientRequest)方法,讀取客戶端請求信息並返回已修改的遠程URL字符串。

+0

真棒迴應!現在,如果有一種方法可以根據後端響應頭來轉換輸入,那麼我已經設置好了。 – mabi 2015-02-24 15:24:23

+0

@mabi你需要清楚你的意思是「輸入」。如果您的意思是「一種基於服務器響應頭來轉換服務器響應內容的方式」,那麼這當然是可能的。當您創建服務器響應轉換器時,您可以獲得服務器響應(包含標頭和全部),因此您可以在轉換服務器響應內容時查看服務器響應標頭。 – sbordet 2015-02-24 17:27:29

+0

我錯過了響應可用於變壓器的事實。是的,那就是我所追求的。保持越來越好,謝謝! – mabi 2015-02-24 21:07:52