Servlet的service()方法没有得到所谓的连接请求,(Servlet service()

2019-09-01 02:24发布

我想写使用的Servlet 3.0码头转发代理。

我有一个简单的代码 -

public class testServlet extends HttpServlet {

   @Override
    protected  void service (HttpServletRequest req, HttpServletResponse resp) throws   ServletException, IOException {
       System.out.println(req.toString());        

  }

}

如果客户端请求HTTP网站,上面的服务方法被调用,但是当请求HTTPS站点(使用HTTP连接方式),上述方法不会被调用。 为什么?

我可以明显地使用码头的处理程序,但我宁愿使用的servlet使代码仍有些便携式(我可以在Glassfish的,托马特,码头等运行)

任何想法可能是错误的?

Answer 1:

它可以提供一个连接请求到Servlet的服务方法,但它最终是徒劳这样做,因为这是不可能处理CONNECT一个servlet内。 你真的没有访问原始的IO流,只有请求/响应的HTTP内容。 你几乎可以做他的工作,但从来没有有效地(无异步IO等),所以,最后你最终会回落至码头的API反正。

另外,为什么不只是建立在已经码头提供的支持:

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



Answer 2:

不知道这将是可能的。

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

与之连接的请求,没有真正用于查找该映射的上下文。 (换句话说,servlet容器将有一个很难知道哪些Servlet来基于在连接请求中的信息执行)

一些想法:

  • 尝试建立一个过滤器,而不是与pathSpec "/*" (所有pathspecs)。
  • 设置你的servlet pathSpec "/"默认的servlet)。 注:可能需要禁用标准DefaultServlet ${jetty.home}/etc/webdefault.xml第一。


Answer 3:

你这样做是不对的。 在Servlet API和框架是编写servlet,即端点。 不写HTTP代理。 HTTP代理是从根本上很简单的事情,理解一个命令, CONNECT ,然后只在两个方向上复制字节。 即使你可以把这项工作作为一个servlet,你几乎肯定不能,对性能的影响是恶劣的,因为容器会打电话给你之前阅读整个请求,并可能缓冲反应也是如此。 你不希望这样的附加延迟所有。



Answer 4:

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

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



文章来源: Servlet service() method not getting called for CONNECT requests