如何在不注入 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 没有太大区别。 但是没有魔法。