一个简单的文件服务器由三个组件组成:
- 绑定到给定地址的
HttpServer, - 从给定目录路径提供文件的
HttpHandler,以及 - 一个可选的
Filter,用于打印与服务器处理的交换相关的日志消息。
简单文件服务器
createFileServer静态工厂方法返回一个简单的开箱即用文件服务器的HttpServer。 该服务器带有一个初始处理程序,该处理程序从给定目录路径(及其子目录)提供文件。 输出级别确定要打印到System.out的日志消息。
简单文件服务器的示例:
var addr = new InetSocketAddress(8080);
var server = SimpleFileServer.createFileServer(addr, Path.of("/some/path"), OutputLevel.INFO);
server.start();
文件处理程序
createFileHandler静态工厂方法返回一个服务文件和目录列表的HttpHandler。 该处理程序仅支持HEAD和GET请求方法;要处理其他请求方法,可以向服务器添加其他处理程序,或通过使用HttpHandlers.handleOrElse(Predicate, HttpHandler, HttpHandler)组合一个处理程序。
组合单个处理程序的示例:
var handler = HttpHandlers.handleOrElse(
(req) -> req.getRequestMethod().equals("PUT"),
(exchange) -> {
// 验证和处理PUT请求
},
SimpleFileServer.createFileHandler(Path.of("/some/path")))
);
输出过滤器
createOutputFilter静态工厂方法返回一个后处理过滤器,用于打印与服务器处理的交换相关的日志消息。 输出格式由outputLevel指定。
输出过滤器的示例:
var filter = SimpleFileServer.createOutputFilter(System.out, OutputLevel.VERBOSE);
var server = HttpServer.create(new InetSocketAddress(8080), 10, "/some/path/", new SomeHandler(), filter);
server.start();
jwebserver工具
通过jwebserver工具提供了一个简单的HTTP文件服务器实现。
- 工具指南:
- jwebserver
- 自版本:
- 18
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enum描述了服务器在处理交换时产生的日志消息输出级别。 -
Method Summary
Modifier and TypeMethodDescriptionstatic HttpHandlercreateFileHandler(Path rootDirectory) 创建一个从给定目录路径(及其子目录)提供文件的文件处理程序。static HttpServercreateFileServer(InetSocketAddress addr, Path rootDirectory, SimpleFileServer.OutputLevel outputLevel) 创建一个从给定路径提供文件的文件服务器。static FiltercreateOutputFilter(OutputStream out, SimpleFileServer.OutputLevel outputLevel)
-
Method Details
-
createFileServer
public static HttpServer createFileServer(InetSocketAddress addr, Path rootDirectory, SimpleFileServer.OutputLevel outputLevel) 创建一个从给定路径提供文件的文件服务器。服务器配置了一个初始上下文,将URI
path映射到一个文件处理程序。 文件处理程序的创建方式类似于调用createFileHandler(rootDirectory),并且与通过调用createContext("/")创建的上下文相关联。 返回的服务器未启动。可以提供输出级别以打印与服务器处理的交换相关的日志消息。 如果给定了
OutputLevel.NONE,则不会打印任何日志消息。- 参数:
-
addr- 要侦听的地址 -
rootDirectory- 要提供的根目录,必须是绝对路径 -
outputLevel- 日志消息输出级别 - 返回:
- 一个HttpServer
- 抛出:
-
IllegalArgumentException- 如果根目录不存在、不是绝对路径、不是目录或不可读 -
UncheckedIOException- 如果发生I/O错误 -
NullPointerException- 如果任何参数为null -
SecurityException- 如果安装了安全管理器并且拒绝了根目录的递归FilePermission"read"
-
createFileHandler
创建一个从给定目录路径(及其子目录)提供文件的文件处理程序。文件处理程序根据给定的
rootDirectory路径解析请求URI,以确定要提供响应的关联文件系统上的路径p。 如果路径p是一个目录,则响应包含一个以HTML格式排列的目录列表作为响应主体。 如果路径p是一个文件,则响应包含基于系统范围的mimeTable上的getContentTypeFor调用确定的最佳猜测内容类型的“Content-Type”标头,以及文件内容作为响应主体。该处理程序仅支持使用HEAD或GET方法的请求,并对使用任何其他方法的请求回复
405响应代码。- 参数:
-
rootDirectory- 要提供的根目录,必须是绝对路径 - 返回:
- 一个文件处理程序
- 抛出:
-
IllegalArgumentException- 如果rootDirectory不存在、不是绝对路径、不是目录或不可读 -
NullPointerException- 如果参数为null -
SecurityException- 如果安装了安全管理器并且拒绝了根目录的递归FilePermission"read"
-
createOutputFilter
- API注释:
- 为了不输出任何日志消息,建议不使用过滤器。
- 参数:
-
out- 要打印到的流 -
outputLevel- 输出级别 - 返回:
- 一个后处理过滤器
- 抛出:
-
IllegalArgumentException- 如果给出了OutputLevel.NONE -
NullPointerException- 如果任何参数为null
-