我们正在使用JAX-RS 1.0,我想在我的资源类中获取客户端IP地址。目前,我将HttpServletRequest
作为方法参数注入,然后获取IP地址。
我想让我的代码更清晰。我在想是否可以使用MessageBodyReader
类并设置IP地址。但是,如果我使用MessageBodyReader
,我必须将XML解组为Java对象,这是我认为的另一种逻辑。
任何人都可以告诉我如何获取客户端IP地址而无需注入HttpServletRequest
。
答案 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
没什么不同。 但是没有魔力。