在坚持使用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,我最终得到null作为我的请求。
我发现了另一个建议,但是这个建议也意味着切换到使用Grizly2,这意味着我必须放弃简单/轻松的JdkHttpServerFactory方法。
答案 0 :(得分:1)
我能看到访问IP的唯一方法是通过HttpExchange
。不幸的是,这不是暴露给我们的东西。您可以发出功能请求来公开IP,也可以自己修改它并构建自己的工件。在任何一种情况下,我建议的更改只是在ContainerRequest
中添加一个属性,您可以在过滤器中提取。
如果您在source code中查看,则会看到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字符串并将其添加为属性值。