Java 开发能够处理HTTPS连接的代理servlet
我开发了一个Javaservlet,它可以代理来自浏览器的HTTP请求。 代理HTTPS请求时遇到问题。Java 开发能够处理HTTPS连接的代理servlet,java,servlets,https,Java,Servlets,Https,我开发了一个Javaservlet,它可以代理来自浏览器的HTTP请求。 代理HTTPS请求时遇到问题。 servlet似乎没有从浏览器接收任何HTTPS请求。 进一步调查后,我注意到HTTP请求似乎以简单的GET请求开始,而HTTPS请求以CONNECT请求开始,如下面的日志摘录所示: "CONNECT ajax.googleapis.com:443 HTTP/1.1" 200 我的问题是,是否可以使用我的servlet处理这个请求 public class MyProxyServlet e
servlet似乎没有从浏览器接收任何HTTPS请求。
进一步调查后,我注意到HTTP请求似乎以简单的GET请求开始,而HTTPS请求以CONNECT请求开始,如下面的日志摘录所示:
"CONNECT ajax.googleapis.com:443 HTTP/1.1" 200
我的问题是,是否可以使用我的servlet处理这个请求
public class MyProxyServlet extends HttpServlet {
@Override
public void init(final ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void doGet(final HttpServletRequest request,
final HttpServletResponse response) throws ServletException,
IOException {
}
@Override
protected void doPost(final HttpServletRequest request,
final HttpServletResponse response) throws ServletException,
IOException {
}
}
如果是,在哪里以及如何进行?通常,HTTPS握手和交换由带有浏览器的servlet容器处理。对于servlet,它不需要知道模式是什么。您必须在服务器配置中定义适当的连接器来侦听HTTPS,并且不需要在web应用程序或servlet端执行任何额外的操作。无论是通过http://还是https://访问servlet,请求都将以相同的方式到达servlet。只有服务器需要配置为接受https://因为默认的
HttpServlet
实现不处理连接谓词,所以您必须覆盖servlet中javax.servlet.http.HttpServlet
的服务
方法,并自己处理CONNECT
方法。最初的实现似乎忽略了这一点,使用了这个resp.senderro(HttpServletResponse.SC_NOT_IMPLEMENTED,errMsg)代码>。看一看HttpServlet源代码你想代理指向不同域的HTTPS请求吗?@home是的,被代理的请求指向任意域我不是这方面的专家,但我想你需要实现一个真正的基于TCP/IP的代理。您不能只在HTTP级别代理HTTPS请求-它将绕过整个SSL信任链…我想您可能想阅读以下内容:您是否检查了服务器是否正在侦听HTTPS连接器?默认的HTTPS端口是443,在tomcat或其他servlet容器中通常是8443。我乐于学习:)浏览器通常不会使用HTTPS与代理服务器通信。他们使用HTTP进行交谈。如果浏览器通过代理服务器连接到internet,并且用户试图导航到安全网站,则浏览器会通过HTTP向代理服务器发出“连接”命令。看看上面的链接——您将看到CONNECT实际上受HTTP支持,但javax.servlet.HTTP.HttpServlet类中似乎没有DoConnection处理程序。我的结论是servlet API根本不支持这个命令。谢谢你为什么不在你的servlet中覆盖javax.servlet.http.HttpServlet
的Service
方法,自己处理CONNECT方法呢?最初的实现似乎忽略了这一点,使用了这个resp.senderro(HttpServletResponse.SC_NOT_IMPLEMENTED,errMsg)代码>。看一看HttpServlet代码,这是一个很好的建议-谢谢您尝试一下。你可能想添加你的评论作为回答,我会接受的。