Java 未为连接请求调用Servlet service()方法

Java 未为连接请求调用Servlet service()方法,java,http,servlets,https,jetty,Java,Http,Servlets,Https,Jetty,我正在尝试使用Servlet3.0在Jetty中编写一个转发代理 我有一个简单的代码- 公共类testServlet扩展了HttpServlet{ @凌驾 受保护的无效服务(HttpServletRequest-req、HttpServletResponse-resp)引发ServletException、IOException{ System.out.println(req.toString()); } } 若客户端请求HTTP站点,将调用上述服务方法,但当请求HTTPS站点时(使用HTTP

我正在尝试使用Servlet3.0在Jetty中编写一个转发代理

我有一个简单的代码-

公共类testServlet扩展了HttpServlet{ @凌驾 受保护的无效服务(HttpServletRequest-req、HttpServletResponse-resp)引发ServletException、IOException{ System.out.println(req.toString()); } } 若客户端请求HTTP站点,将调用上述服务方法,但当请求HTTPS站点时(使用HTTP连接方法),将不调用上述方法。为什么?

我显然可以使用Jetty的处理程序,但我更喜欢使用servlet,这样代码就可以保持一定的可移植性(我可以在Glassfish、Tomat、Jetty等环境下运行它)


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

不确定这是否可行

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

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

一些想法:

  • 请尝试使用pathSpec
    “/*”
    (适用于所有pathSpec)设置筛选器
  • 将Servlet设置为pathSpec
    “/”
    (对于默认Servlet)。注意:可能需要先禁用
    ${jetty.home}/etc/webdefault.xml
    中的标准DefaultServlet

    • 不确定这是否可行

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

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

      一些想法:

      • 请尝试使用pathSpec
        “/*”
        (适用于所有pathSpec)设置筛选器
      • 将Servlet设置为pathSpec
        “/”
        (对于默认Servlet)。注意:可能需要先禁用
        ${jetty.home}/etc/webdefault.xml
        中的标准DefaultServlet
      您可以比较这两种方法之间的异同。 但这两种方法都是子类,方法参数是不同的

      或者您可以尝试使用doPOST、doGET方法。 不会说英语真的好痛。。。呵呵,我需要用翻译工具来回答你的问题

      您可以比较这两种方法之间的异同。 但这两种方法都是子类,方法参数是不同的

      或者您可以尝试使用doPOST、doGET方法。
      不会说英语真的好痛。。。呵呵,我需要使用翻译工具来回答您的问题

      可以将连接请求传递到Servlet服务方法,但这样做最终是徒劳的,因为不可能在Servlet中处理连接。您实际上没有访问原始IO流的权限,只有请求/响应的HTTP内容。您几乎可以完成他的工作,但从来没有效率(没有异步IO等),因此最终还是会回到Jetty API

      此外,为什么不利用Jetty已经提供的支持:


      可以将连接请求传递给Servlet服务方法,但这样做最终是徒劳的,因为不可能在Servlet内部处理连接。您实际上没有访问原始IO流的权限,只有请求/响应的HTTP内容。您几乎可以完成他的工作,但从来没有效率(没有异步IO等),因此最终还是会回到Jetty API

      此外,为什么不利用Jetty已经提供的支持:


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

      您这样做是错误的。ServletAPI和框架用于编写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);
      }