我们正在使用 JAX-RS 1.0,我想在我的资源类中获取客户端 IP 地址。目前,我将 HttpServletRequest
作为方法参数注入(inject),然后获取 IP 地址。
我想让我的代码更简洁。我在想是否可以使用 MessageBodyReader
类并设置 IP 地址。但是,如果我使用 MessageBodyReader
,我必须将 XML 解码为 Java 对象,据我所知,这是额外的逻辑。
谁能告诉我如何在不注入(inject) HttpServletRequest
的情况下获取客户端 IP 地址。
最佳答案
没有什么魔法。你能做的就是包裹 HttpServletRequest
到具有请求范围 ( @RequestScoped
) 的 CDI bean 中,然后将此 bean 注入(inject)到您的 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();
}
}
我知道这种方法与注入(inject)HttpServletRequest
没有太大区别。 。 但这并没有什么魔力。
关于jakarta-ee - 如何在不注入(inject) HttpServletRequest 的情况下获取 JAX-RS 资源类中的客户端 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38243446/