没有为CONNECT请求调用Servlet service()方法

时间:2013-04-25 00:09:42

标签: java http servlets https jetty

我正在尝试使用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等下运行)

知道可能出现什么问题吗?

4 个答案:

答案 0 :(得分:3)

可以向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

答案 1 :(得分:1)

不确定这是可能的。

一般来说,Servlet需要请求中的上下文来知道要执行哪个servlet。这是一个pathSpec到Servlet描述符中存在的Servlet的映射。

使用CONNECT请求时,实际上没有用于查找此映射的上下文。 (换句话说,Servlet容器很难根据CONNECT请求中的信息知道要执行哪个Servlet)

一些想法:

  • 尝试使用pathSpec "/*"设置过滤器(适用于所有路径规范)。
  • 将Servlet设置为pathSpec "/"(默认servlet)。注意:可能需要先在${jetty.home}/etc/webdefault.xml中禁用标准DefaultServlet。

答案 2 :(得分:1)

你做错了。 Servlet API和框架用于编写servlet,即端点。不适用于编写HTTP代理。 HTTP代理基本上是非常简单的事情,它们理解一个命令CONNECT,然后只是在两个方向上复制字节。即使您可以将此工作作为servlet(几乎肯定不能),性能影响也会很恶劣,因为容器会在调用您之前读取整个请求,并且可能也会缓冲响应。你不希望所有这些增加延迟。

答案 3 :(得分:-1)

@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方法。

不会说英语真的好痛......呵呵我需要用翻译工具回答你的问题