Module jdk.httpserver

Class SimpleFileServer

java.lang.Object
com.sun.net.httpserver.SimpleFileServer

public final class SimpleFileServer extends Object
一个简单的HTTP文件服务器及其组件(仅用于测试、开发和调试目的)。

一个简单的文件服务器由三个组件组成:

  • 绑定到给定地址的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。 该处理程序仅支持HEADGET请求方法;要处理其他请求方法,可以向服务器添加其他处理程序,或通过使用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
  • 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

      public static HttpHandler createFileHandler(Path rootDirectory)
      创建一个从给定目录路径(及其子目录)提供文件的文件处理程序

      文件处理程序根据给定的rootDirectory路径解析请求URI,以确定要提供响应的关联文件系统上的路径p。 如果路径p是一个目录,则响应包含一个以HTML格式排列的目录列表作为响应主体。 如果路径p是一个文件,则响应包含基于系统范围的mimeTable上的getContentTypeFor调用确定的最佳猜测内容类型的“Content-Type”标头,以及文件内容作为响应主体。

      该处理程序仅支持使用HEADGET方法的请求,并对使用任何其他方法的请求回复405响应代码。

      参数:
      rootDirectory - 要提供的根目录,必须是绝对路径
      返回:
      一个文件处理程序
      抛出:
      IllegalArgumentException - 如果rootDirectory不存在、不是绝对路径、不是目录或不可读
      NullPointerException - 如果参数为null
      SecurityException - 如果安装了安全管理器并且拒绝了根目录的递归FilePermission "read"
    • createOutputFilter

      public static Filter createOutputFilter(OutputStream out, SimpleFileServer.OutputLevel outputLevel)
      创建一个后处理过滤器,用于打印与交换相关的日志消息。 日志消息以UTF-8编码打印到给定的OutputStream中。
      API注释:
      为了不输出任何日志消息,建议不使用过滤器。
      参数:
      out - 要打印到的流
      outputLevel - 输出级别
      返回:
      一个后处理过滤器
      抛出:
      IllegalArgumentException - 如果给出了OutputLevel.NONE
      NullPointerException - 如果任何参数为null