如何在不注入 HttpServletRequest 的情况下获取 JAX-RS 资源 class 中的客户端 IP 地址?
How to get the client IP address in a JAX-RS resource class without injecting the HttpServletRequest?
我们正在使用 JAX-RS 1.0,我想在我的资源 class 中获取客户端 IP 地址。目前我将 HttpServletRequest
作为方法参数注入,然后获取 IP 地址。
我想让我的代码更简洁。我在想我是否可以使用 MessageBodyReader
class 并设置 IP 地址。但是,如果我使用 MessageBodyReader
,我必须将 XML 解组为 Java 对象,据我所知,这是额外的逻辑。
任何人都可以让我知道如何获取客户端 IP 地址而无需注入 HttpServletRequest
。
没有魔法。你可以做的是包装 HttpServletRequest
into a CDI bean with request scope (@RequestScoped
) 然后将这个 bean 注入你的 JAX-RS 资源 类:
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
@RequestScoped
public class RequestDetails {
@Inject
private HttpServletRequest request;
public String getRemoteAddress() {
return request.getRemoteAddr();
}
}
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Stateless
@Path("client-address")
public class ClientAddressResource {
@Inject
private RequestDetails requestDetails;
@GET
@Produces(MediaType.TEXT_PLAIN)
public Response getClientRemoteAddress() {
return Response.ok(requestDetails.getRemoteAddress()).build();
}
}
我知道这种方法与注入 HttpServletRequest
没有太大区别。 但是没有魔法。
我们正在使用 JAX-RS 1.0,我想在我的资源 class 中获取客户端 IP 地址。目前我将 HttpServletRequest
作为方法参数注入,然后获取 IP 地址。
我想让我的代码更简洁。我在想我是否可以使用 MessageBodyReader
class 并设置 IP 地址。但是,如果我使用 MessageBodyReader
,我必须将 XML 解组为 Java 对象,据我所知,这是额外的逻辑。
任何人都可以让我知道如何获取客户端 IP 地址而无需注入 HttpServletRequest
。
没有魔法。你可以做的是包装 HttpServletRequest
into a CDI bean with request scope (@RequestScoped
) 然后将这个 bean 注入你的 JAX-RS 资源 类:
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
@RequestScoped
public class RequestDetails {
@Inject
private HttpServletRequest request;
public String getRemoteAddress() {
return request.getRemoteAddr();
}
}
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Stateless
@Path("client-address")
public class ClientAddressResource {
@Inject
private RequestDetails requestDetails;
@GET
@Produces(MediaType.TEXT_PLAIN)
public Response getClientRemoteAddress() {
return Response.ok(requestDetails.getRemoteAddress()).build();
}
}
我知道这种方法与注入 HttpServletRequest
没有太大区别。 但是没有魔法。