0

我正在尝试使用 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

4 回答 4

3

It is possible to deliver a CONNECT request to a Servlet service method, but it is ultimately futile to do so because it is impossible to handle a CONNECT inside a servlet. You don't really have access to the raw IO streams, only the HTTP content of the request/response. You can almost make his work, but never efficiently (no async IO etc.) So ultimately you will end up falling back to Jetty APIs anyway.

Also, why not just build on the support already provided by 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

于 2013-04-25T03:21:49.280 回答
1

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

于 2013-04-25T04:48:52.813 回答
1

不确定这是否可能。

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

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

一些想法:

  • 尝试使用 pathSpec 设置过滤器"/*"(适用于所有路径规范)。
  • 将您的 Servlet 设置为 pathSpec "/"(对于默认 servlet)。注意:可能需要先禁用标准 DefaultServlet ${jetty.home}/etc/webdefault.xml
于 2013-04-25T00:25:10.067 回答
-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方法。

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

于 2013-04-25T01:47:20.417 回答