【问题标题】:Servlet service() method not getting called for CONNECT requests没有为 CONNECT 请求调用 Servlet service() 方法
【发布时间】:2013-04-18 17:33:04
【问题描述】:

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

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

【问题讨论】:

    标签: java http servlets https jetty


    【解决方案1】:

    不确定这是否可行。

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

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

    一些想法:

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

    【讨论】:

      【解决方案2】:
      @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方法。

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

      【讨论】:

        【解决方案3】:

        可以将 CONNECT 请求传递给 Servlet 服务方法,但这样做最终是徒劳的,因为不可能在 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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-23
            • 1970-01-01
            • 1970-01-01
            • 2015-10-02
            • 1970-01-01
            • 1970-01-01
            • 2020-08-02
            相关资源
            最近更新 更多