
在使用 Java 内置 SimpleFileServer.createFileHandler 构建静态文件服务时,可通过添加索引页或自定义上下文处理器来阻止默认的目录内容暴露,从而安全地禁用目录列表。
在使用 java 内置 `simplefileserver.createfilehandler` 构建静态文件服务时,可通过添加索引页或自定义上下文处理器来阻止默认的目录内容暴露,从而安全地禁用目录列表。
Java 标准库(自 JDK 11 起)提供了轻量级的 com.sun.net.httpserver 模块,其中 SimpleFileServer.createFileHandler 是快速搭建静态资源服务的便捷工具。但其默认行为会在请求目录路径(如 /file/)且该目录下无默认索引文件时,自动返回可点击的 HTML 目录列表——这在生产环境中存在信息泄露风险,需主动禁用。
✅ 推荐方案一:部署索引文件(最简方式)
只需在目标目录(如 d:ile)中放置一个名为 index.html 或 index.htm 的文件(内容可为空或自定义欢迎页),SimpleFileServer 将优先返回该文件,而不再渲染目录结构:
var server = HttpServer.create(new InetSocketAddress(8080), 2);
server.createContext("/file/", SimpleFileServer.createFileHandler(Path.of("d:\file")));
server.start();⚠️ 注意路径分隔符:Windows 下应使用双反斜杠
或正斜杠/(如"d:/file"),避免转义错误;同时务必在 context path 末尾添加/(即"/file/"),否则/file会意外匹配/file-abc等路径(参见 [JDK API 文档说明](https://www.php.cn/link/f6bebf6733d9f6e591987187528d9c4d)))。
✅ 推荐方案二:自定义 Handler(完全可控)
若需彻底禁止任何目录访问(包括返回 403 或 404),可绕过 SimpleFileServer 的默认逻辑,手动拦截纯目录请求:
立即学习“Java免费学习笔记(深入)”;
var server = HttpServer.create(new InetSocketAddress(8080), 2);
var fileHandler = SimpleFileServer.createFileHandler(Path.of("d:\file"));
server.createContext("/file/", exchange -> {
String requestPath = exchange.getRequestURI().getPath();
String contextPath = exchange.getHttpContext().getPath();
// 判断是否为“仅访问目录本身”(无具体文件名)
if (requestPath.equals(contextPath) || requestPath.equals(contextPath + "/")) {
exchange.sendResponseHeaders(404, -1); // 或 403
try (var os = exchange.getResponseBody()) {
os.write("Directory listing disabled.".getBytes(StandardCharsets.UTF_8));
}
return;
}
// 否则交由原 handler 处理文件请求
fileHandler.handle(exchange);
});
server.start();? 安全提示
-
SimpleFileServer不支持路径遍历防护(如..%2Fetc%2Fpasswd),生产环境切勿直接暴露敏感目录;建议前置 Nginx 或使用 Spring Boot、Jetty 等更健壮的 Web 容器。 -
com.sun.*包属 JDK 内部 API,虽当前稳定,但非官方公开契约,长期项目应评估迁移至标准 Servlet 容器的可行性。 - 启动后务必验证:访问
http://localhost:8080/file/应返回索引页或 404/403,而非超链接目录列表。
通过以上任一方式,即可在保持代码简洁的同时,有效关闭危险的目录浏览功能。


















