Добавление фильтра для определения удаленного IP-адреса запрашивающей стороны с использованием JdkHttpServerFactory - PullRequest
0 голосов
/ 03 мая 2018

Есть ли способ получить удаленный IP-адрес при подключении к инфраструктуре JdkHttpServerFactory?

У меня очень легкий 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, но это означает, что мне нужно ввести инфраструктуру сервлета, и это на самом деле не сработало для меня с JdkHttpServerFactory, в результате я получил нулевое значение в качестве моего запроса.

Я нашел другое предложение, но оно также означало переход на использование Grizly2, что означает, что мне придется отказаться от простого / легкого метода JdkHttpServerFactory.

1 Ответ

0 голосов
/ 03 мая 2018

Единственный способ увидеть доступ к 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 и добавить ее в качестве значения свойства.

...