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();
}
}
}
3. Cookie
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();
}
}