javahttpserver详解

发布时间:2023-05-20

JavaHttpServer是一个轻量级的Java HTTP服务器实现。它提供了高可靠性、高性能、高扩展性的Web应用实例,完全可以替代一些商业Http服务器。

一、基本概念

JavaHttpServer是一个基于Java语言开发的轻量级Http服务器,是JavaSE(标准版)中自带的网络服务组件,无需安装额外的插件或框架。它仅依赖于JRE,开发者可以直接调用Java标准API进行开发,是一种非常方便的开发工具。 JavaHttpServer在Java SE 6中引入,可以处理HTTP/1.1请求,支持静态和动态生成内容,并支持SSL加密。它支持多种HTTP方法,如GET、POST、PUT、DELETE,支持Cookie、Session、缓存、压缩、安全认证等功能。JavaHttpServer还提供了一组API,使得开发者可以方便地扩展JavaHttpServer,按照需求实现自己的Http服务。

二、使用方法

使用JavaHttpServer来开发一个Web应用程序是非常简单的,以下是一个简单的例子:

import com.sun.net.httpserver.*;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
public class MyHttpServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(null);
        server.start();
    }
    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange exchange) throws IOException {
            String response = "Hello World!";
            exchange.sendResponseHeaders(200, response.length());
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

在该例子中,代码通过HttpServer对象创建了一个本地服务器并监听8000端口。然后通过server.createContext()方法添加一个处理器MyHandler,根据用户请求返回“Hello World!”。

三、主要功能

1. 路由和处理器

JavaHttpServer允许开发者通过注册处理器来处理来自客户端的请求,并将它们路由到正确的处理器。开发者可以使用HttpExchange对象来处理请求、响应数据和设置HTTP头信息。以下代码是一个使用基本路由和处理器的例子:

// 创建HttpServer,并命名它为server
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
// 创建上下文和处理器
server.createContext("/users", new UsersHandler());
server.createContext("/products", new ProductsHandler());
// 启动服务器
server.start();
// 处理器UsersHandler
static class UsersHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        // 处理users路由
    }
}
// 处理器ProductsHandler
static class ProductsHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        // 处理products路由
    }
}

2. 静态文件服务

JavaHttpServer也允许开发者通过添加静态文件处理器来服务于静态文件。以下是创建一个简单的静态文件处理器的例子:

// 创建静态文件处理器对象
HttpHandler staticHandler = new StaticFileHandler();
// 创建HttpServer,并为根路由添加静态文件处理器
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/", staticHandler);
// 启动服务器
server.start();
// 处理静态文件的处理器
static class StaticFileHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        String path = exchange.getRequestURI().getPath().substring(1);
        if ("".equals(path)) {
            path = "index.html";
        }
        InputStream stream = getClass().getResourceAsStream(path);
        if (stream != null) {
            byte[] bytes = IOUtils.toByteArray(stream);
            exchange.sendResponseHeaders(200, bytes.length);
            exchange.getResponseBody().write(bytes);
            exchange.close();
        } else {
            exchange.sendResponseHeaders(404, 0);
            exchange.close();
        }
    }
}

JavaHttpServer能够支持HTTP状态管理,包括Cookies。开发者可以通过以下方法设置Cookie:

HttpExchange exchange = ...;
HttpHeaders headers = exchange.getResponseHeaders();
headers.add("Set-Cookie", "name=value; Domain=domain.com; Max-Age=1000; Path=/");
// 获取Cookie
List<String> cookies = headers.get("Cookie");

4. SSL

JavaHttpServer支持加密协议,并包含了SSL支持。以下是一个使用JavaHttpServer启用SSL的例子:

// 实例化SSLContext
char[] password = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("keystore.jks");
ks.load(fis, password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// 启用SSL
HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(8000), 0);
httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
httpsServer.start();

5. 缓存和压缩

JavaHttpServer能够缓存静态资源,同时提供压缩机制。以下是一个使用JavaHttpServer缓存和压缩的例子:

// 创建HttpServer,并启动gzip压缩和缓存
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
GzipFilter gzipFilter = new GzipFilter();
server.createContext("/static/", new StaticHandler());
server.createContext("/", new DynamicHandler());
server.setExecutor(null);
server.start();
// 静态资源的处理器
static class StaticHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        File file = new File("static", exchange.getRequestURI().toString().substring(8));
        if (file.exists()) {
            byte[] bytes = Files.readAllBytes(file.toPath());
            Headers headers = exchange.getResponseHeaders();
            // 启用gzip压缩
            headers.add("Content-Encoding", "gzip");
            // 启用缓存(缓存1分钟)
            headers.add("Cache-Control", "max-age=60");
            // 压缩文件并返回
            OutputStream os = new GZIPOutputStream(exchange.getResponseBody());
            os.write(bytes);
            os.close();
            exchange.close();
        } else {
            exchange.sendResponseHeaders(404, 0);
            exchange.close();
        }
    }
}
// 动态资源的处理器
static class DynamicHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        Headers headers = exchange.getResponseHeaders();
        // 启用缓存(缓存1分钟)
        headers.add("Cache-Control", "max-age=60");
        String response = "Hello World!";
        exchange.sendResponseHeaders(200, response.length());
        OutputStream os = exchange.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }
}