[英]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)來設置過濾器。 "/"
(用於默認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);
}
您可以比較這兩種方法之間的異同。 但是這兩種方法都是方法參數的所有子類都不同
不會英語真的很痛苦...呵呵,我需要使用翻譯工具來回答您的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.