Поскольку сейчас это не possible для доступа к удаленной информации IP от Grizzly контекста, я реализовал это грязный хак:
Во-первых, у меня есть добавлено новое связующее вложение для зависимостей в мое приложение, которое свяжет экземпляр java.net.SocketAddress с одним источником запроса IP:
package test;
import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import javax.inject.Inject;
import javax.inject.Provider;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.process.internal.RequestScoped;
import org.glassfish.jersey.server.ContainerRequest;
public class RemoteAddrBinder extends AbstractBinder {
private static class RemoteAddrProviderFactory implements Factory<SocketAddress> {
@Inject
private Provider<ContainerRequest> request;
@Override
public SocketAddress provide() {
ContainerRequest containerRequest = request.get();
PropertiesDelegate delegate = containerRequest.getPropertiesDelegate();
try {
Field requestField = delegate.getClass().getDeclaredField("request");
requestField.setAccessible(true);
Request grizzlyRequest = (Request) requestField.get(delegate);
return new InetSocketAddress(grizzlyRequest.getRemoteAddr(), grizzlyRequest.getRemotePort());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void dispose(SocketAddress instance) {
}
}
@Override
protected void configure() { bindFactory(RemoteAddrProviderFactory.class).to(SocketAddress.class).in(RequestScoped.class);
}
}
Тогда я зарегистрировал это связующее в заявке:
application.register(new RemoteAddrBinder());
Теперь SocketAddress может быть введен в любой метод JAX-RS:
@GET
@Path("test")
public Response test(@Context SocketAddress remoteAddr) {
return Response.ok("Your IP is: " + ((InetSocketAddress) remoteAddr).getAddress().getHostAddress()).build();
}
Надежда это помогает кому-то :)
Но у меня нет HttpServletRequest класса в моем пути к классам. Может быть, это потому, что я использую HTTP-сервер Grizzly? – spektom
Действительно? [Javadoc I find] (http://grizzly.java.net/nonav/docs/2.0/apidocs/index.html) для Grizzly указывает, что классы довольно тщательно связаны с классами сервлета, поэтому он должен быть доступен во время выполнения (или Grizzly _wouldn't_ work).Я предполагаю, что ваш путь к классам сборки не завершен ... –
Я попытался добавить API сервлета в мой путь к классам сборки, но эта переменная не вводится в среду выполнения - я получаю null. – spektom