我正在使用 com.sun.net.httpserver.HttpServer 在 kubernates 微服务中公开 REST API。到目前为止,它都是通配符绑定。我需要删除通配符绑定才能将其绑定到其本地 IP
我正在使用 com.sun.net.httpserver.HttpServer 在 kubernates 微服务中公开 REST API。到现在为止我一直在用
httpServer = JdkHttpServerFactory.createHttpServer("http://localhost:" + port + "/"", resourceConfig, false);
httpServer.start();
这样,端口将具有通配符绑定,任何人都可以通过它进行连接。
我现在需要从该端口删除通配符绑定,并将我的代码修改为以下
InetAddress localHost = InetAddress.getLoopbackAddress();
InetSocketAddress sockAddr = new InetSocketAddress(localHost, port);
httpServer = com.sun.net.httpserver.HttpServer.create();
httpServer.bind(sockAddr,5);
httpServer.start();
通过上面的代码,我看到通配符绑定已被删除([::ffff:127.0.0.1]:),但无法从 Pod 内部或外部访问 API。
编辑(也尝试过此代码)
InetSocketAddress sockAddr = new InetSocketAddress(localHost, port);
httpServer = com.sun.net.httpserver.HttpServer.create();
httpServer.bind(sockAddr,5);
httpServer.start();
使用上面的代码netstat显示*绑定但没有看到错误404。相反,curl 命令永远不会出现。
有人可以指出这里的错误吗?
您必须调用
server.createContext
方法来注册自己的 HTTP 请求处理程序并自行完成 HTTP 请求。
例如:
var server = com.sun.net.httpserver.HttpServer.create();
server.createContext("/", exchange -> {
try(var os = exchange.getResponseBody())
{
var buffer = "hello world".getBytes(StandardCharsets.UTF_8);
exchange.sendResponseHeaders(200, buffer.length);
os.write(buffer);
os.flush();
}
});
此外,如果您想在任何网络浏览器中请求该服务器,您将必须自己处理响应标头(通过调用
exchange.getResponseHeaders().add("xxx", "xxx")
)并处理预检请求以解决 CORS 策略问题。