如何在不注入HttpServletRequest的情况下在JAX-RS资源类中获取客户端IP地址?

时间:2016-07-07 10:44:19

标签: java-ee jax-rs java-ee-6

我们正在使用JAX-RS 1.0,我想在我的资源类中获取客户端IP地址。目前,我将HttpServletRequest作为方法参数注入,然后获取IP地址。

我想让我的代码更清晰。我在想是否可以使用MessageBodyReader类并设置IP地址。但是,如果我使用MessageBodyReader,我必须将XML解组为Java对象,这是我认为的另一种逻辑。

任何人都可以告诉我如何获取客户端IP地址而无需注入HttpServletRequest

1 个答案:

答案 0 :(得分:2)

没有魔力。你可以做的是将HttpServletRequest包装到带有请求范围(@RequestScoped)的CDI bean中,然后将这个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没什么不同。 但是没有魔力。