添加过滤器以使用 JdkHttpServerFactory 查找请求者的远程 IP 地址



有没有办法在坚持使用JdkHttpServerFactory框架的同时获取远程IP地址?

我有一个非常轻巧的RESTful服务器,它使用JdkHttpServerFactory创建一个服务器,基本上只有一行代码:

JdkHttpServerFactory.createHttpServer(baseUri, config(;

我的依赖项是:

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jdk-http</artifactId>
<version>2.23.2</version>
</dependency>

似乎向此框架添加过滤器并非易事。 我已经通过引入 HttpServletRequest 进行了尝试,但这意味着我需要引入 servlet 框架,这实际上对我不起作用 JdkHttpServerFactory,我最终得到空作为我的请求。

我发现了另一个建议,但该建议也意味着切换到使用Grizly2,这意味着我必须放弃简单/轻量级的JdkHttpServerFactory方法。

我可以看到访问 IP 的唯一方法是通过HttpExchange.不幸的是,这不是暴露在我们面前的事情。您可以发出功能请求以公开 IP,也可以自己修改它并构建自己的项目。无论哪种情况,我建议进行的更改都是在ContainerRequest中添加一个属性,您可以在过滤器中提取该属性。

如果你在源代码中查看这里,你会看到ContainerRequest。我只会做这样的事情

final ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri,
exchange.getRequestMethod(), getSecurityContext(exchange.getPrincipal(), isSecure),
new MapPropertiesDelegate());
requestContext.setProperty(JdkServerProperties.REMOTE_IP_ADDR, exchange.getRemoteAddr());

然后在你的ContainerRequestFilter,你可以做

@Override
public void filter(ContainerRequestContext requestContext) {
// ContainerRequest implements ContainerRequestContext
InetSockAddress remoteAddr = (InetSocketAddress) requestContext.getProperty(JdkServerProperties.REMOTE_IP_ADDR);
}

是的,所以如果我要发出功能/拉取请求或只是构建自己的工件,这可能是我要做的更改。或者,如果您不想公开InetSocketAddress,您可以只构建 IP 字符串并将其添加为属性值。

最新更新