Module jdk.httpserver

Package com.sun.net.httpserver


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

主要组件包括:

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

SimpleFileServer类提供了一个简单的仅HTTP文件服务器(仅用于测试、开发和调试目的)。通过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); // .. 读取请求体
           String 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); // 创建一个默认执行器
   server.start();
   

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

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

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

对于敏感信息,可以使用HttpsServer来处理由SSL或TLS协议保护的“https”请求。HttpsServer必须提供一个包含初始化的SSLContextHttpsConfigurator对象。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) {

        // 如果需要,获取远程地址
        InetSocketAddress remote = params.getClientAddress();

        SSLContext c = getSSLContext();

        // 获取默认参数
        SSLParameters sslparams = c.getDefaultSSLParameters();
        if (remote.equals (...) ) {
            // 修改客户端x的默认设置
        }

        params.setSSLParameters(sslparams);
        // 上面的语句可能会抛出IAE(IllegalArgumentException),如果任何参数无效。
        // 例如,如果应用程序具有UI并且参数由用户提供。

        }
    });
   
自版本:
1.6