软件包 com.sun.net.httpserver


com.sun.net.httpserver
提供简单的高级 Http 服务 API,可用于构建嵌入式 HTTP 服务。支持“http”和“https”。 API 提供了 RFC 2616 (HTTP 1.1) 和 RFC 2818(基于 TLS 的 HTTP)的部分实现。此 API 未提供的任何 HTTP 功能都可以通过使用该 API 的应用程序代码来实现。

主要组成部分是:

  • 描述请求和响应对的 HttpExchange 类,
  • 处理传入请求的 HttpHandler 接口,以及提供有用的处理程序实现的 HttpHandlers 类,
  • 将 URI 路径映射到 HttpHandlerHttpContext 类,
  • HttpServer 类用于监听连接并将请求分派给处理程序,
  • 允许对请求进行预处理和后处理的 Filter 类。

SimpleFileServer 类提供了一个简单的 HTTP-only 文件服务(仅用于测试、开发和调试目的)。 jwebserver 工具提供了默认实现。

程序员必须实现 HttpHandler 接口。该接口提供了一个回调,调用它来处理来自客户端的传入请求。 HTTP 请求及其响应称为交换。 HTTP 交换由 HttpExchange 类表示。 HttpServer 类用于监听传入的 TCP 连接,并将这些连接上的请求分派给已在服务注册的处理程序。

下面显示了一个最小的 Http 服务示例:

  class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException {
      InputStream is = t.getRequestBody();
      read(is); // .. read the request body
      String response = "This is the response";
      t.sendResponseHeaders(200, response.length());
      OutputStream os = t.getResponseBody();
      os.write(response.getBytes());
      os.close();
    }
  }
  ...

  HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
  server.createContext("/applications/myapp", new MyHandler());
  server.setExecutor(null); // creates a default executor
  server.start();
  

上面的示例创建了一个简单的 HttpServer,它使用调用应用程序线程为指向端口 8000 和路径 /applications/myapp/ 的传入 http 请求调用 handle() 方法。

HttpExchange 类封装了应用程序处理传入请求和生成适当响应所需的一切。

向 HttpServer 注册处理程序会创建一个 HttpContext 对象,并且可以将 Filter 对象添加到返回的上下文中。过滤器用于在将交换传递给交换处理程序之前执行交换的自动预处理和后处理。

对于敏感信息,HttpsServer 可用于处理受 SSL 或 TLS 协议保护的“https”请求。必须为 HttpsServer 提供一个 HttpsConfigurator 对象,其中包含一个已初始化的 SSLContext 。 HttpsConfigurator 可用于配置密码套件和其他 SSL 操作参数。一个简单的示例 SSLContext 可以创建如下:

  char[] passphrase = "passphrase".toCharArray();
  KeyStore ks = KeyStore.getInstance("JKS");
  ks.load(new FileInputStream("testkeys"), passphrase);

  KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
  kmf.init(ks, passphrase);

  TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
  tmf.init(ks);

  SSLContext ssl = SSLContext.getInstance("TLS");
  ssl.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  

在上面的示例中,使用 keytool 实用程序创建的名为“testkeys”的密钥库文件用作客户端和服务证书的证书库。以下代码显示了如何在 HttpsConfigurator 中使用 SSLContext,以及如何将 SSLContext 和 HttpsConfigurator 链接到 HttpsServer。

  server.setHttpsConfigurator (new HttpsConfigurator(sslContext) {
    public void configure (HttpsParameters params) {

    // get the remote address if needed
    InetSocketAddress remote = params.getClientAddress();

    SSLContext c = getSSLContext();

    // get the default parameters
    SSLParameters sslparams = c.getDefaultSSLParameters();
    if (remote.equals (...) ) {
      // modify the default set for client x
    }

    params.setSSLParameters(sslparams);
    // statement above could throw IAE if any params invalid.
    // eg. if app has a UI and parameters supplied by a user.

    }
  });
  
自从:
1.6