我正在尝试使用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等下运行)
知道可能出现什么问题吗?
答案 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)
一些想法:
"/*"
设置过滤器(适用于所有路径规范)。"/"
(默认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);
}
您可以比较这两种方法之间的异同。 但是这两个方法都是方法参数的子类不同
不会说英语真的好痛......呵呵我需要用翻译工具回答你的问题