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

时间:2018-05-02 21:03:08

标签: rest jersey glassfish

在坚持使用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方法。

1 个答案:

答案 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字符串并将其添加为属性值。