簡體   English   中英

沒有為CONNECT請求調用Servlet service()方法

[英]Servlet service() method not getting called for CONNECT requests

我正在嘗試使用Servlet 3.0在Jetty中編寫轉發代理。

我有一個簡單的代碼-

public class testServlet extends HttpServlet {

   @Override
    protected  void service (HttpServletRequest req, HttpServletResponse resp) throws   ServletException, IOException {
       System.out.println(req.toString());        

  }

}

如果客戶端請求HTTP站點,則將調用上述服務方法,但是當請求HTTPS站點(使用HTTP Connect方法)時,將不會調用上述方法。 為什么?

我顯然可以使用Jetty的處理程序,但我更喜歡使用servlet,以便代碼保持可移植性(我可以在Glassfish,Tomat,Jetty等環境下運行它)

知道有什么問題嗎?

可以向Servlet服務方法傳遞CONNECT請求,但是這樣做最終是徒勞的,因為不可能在Servlet內部處理CONNECT。 您實際上沒有訪問原始IO流的權限,只有訪問請求/響應的HTTP內容的權限。 您幾乎可以完成他的工作,但是效率卻很高(沒有異步IO等),因此最終您最終還是會退回到Jetty API。

另外,為什么不僅僅基於Jetty已經提供的支持:

http://download.eclipse.org/jetty/stable-9/xref/org/eclipse/jetty/proxy/ConnectHandler.html http://download.eclipse.org/jetty/stable-9/xref/org/eclipse /jetty/proxy/ProxyServlet.html

不確定是否有可能。

一般來說,Servlet需要來自請求的上下文,以知道要執行哪個Servlet。 這是pathSpec到Servlet描述符中存在的Servlet的映射。

對於CONNECT請求,實際上沒有上下文可用於查找此映射。 (換句話說,基於CONNECT請求中的信息,Servlet容器將很難知道要執行哪個Servlet)

一些想法:

  • 嘗試使用pathSpec "/*" (對於所有pathspec)來設置過濾器。
  • 將您的Servlet設置為pathSpec "/" (用於默認Servlet)。 注意:可能需要先在${jetty.home}/etc/webdefault.xml禁用標准DefaultServlet。

您做錯了。 Servlet API和框架用於編寫servlet,即端點。 不適用於編寫HTTP代理。 HTTP代理從根本上講是非常簡單的事情,可以理解一個命令CONNECT ,然后只需雙向復制字節即可。 即使您可以將它作為servlet來工作(幾乎可以肯定也不能做到),對性能的影響也將是可怕的,因為容器會在調用您之前讀取整個請求,並可能還會緩沖響應。 您不希望所有增加的延遲。

@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    super.service(arg0, arg1);
}

@Override
public void service(ServletRequest arg0, ServletResponse arg1)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    super.service(arg0, arg1);
}

您可以比較這兩種方法之間的異同。 但是這兩種方法都是方法參數的所有子類都不同

或者,您可以嘗試使用doPOST,doGET方法。

不會英語真的很痛苦...呵呵,我需要使用翻譯工具來回答您的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM