我想写使用的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的,托马特,码头等运行)
任何想法可能是错误的?
它可以提供一个连接请求到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
不知道这将是可能的。
一般来说,Servlet的要求从请求上下文知道要执行哪个servlet。 这是一个pathSpec到存在在Servlet描述一个Servlet的映射。
与之连接的请求,没有真正用于查找该映射的上下文。 (换句话说,servlet容器将有一个很难知道哪些Servlet来基于在连接请求中的信息执行)
一些想法:
- 尝试建立一个过滤器,而不是与pathSpec
"/*"
(所有pathspecs)。 - 设置你的servlet pathSpec
"/"
默认的servlet)。 注:可能需要禁用标准DefaultServlet ${jetty.home}/etc/webdefault.xml
第一。
你这样做是不对的。 在Servlet API和框架是编写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);
}
你可以比较一下这两种方法之间的异同。 但是这两种方法的方法参数的所有子类是不同的
或者你可以尝试使用的doPost,doGet方法。
不会说英语真的好痛苦......呵呵,我需要使用翻译工具来回答你的问题