Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 开发能够处理HTTPS连接的代理servlet_Java_Servlets_Https - Fatal编程技术网

Java 开发能够处理HTTPS连接的代理servlet

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

我开发了一个Javaservlet,它可以代理来自浏览器的HTTP请求。 代理HTTPS请求时遇到问题。
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代码,这是一个很好的建议-谢谢您尝试一下。你可能想添加你的评论作为回答,我会接受的。