问题
We are using JAX-RS 1.0 and I want to get the client IP address in my resource class. Currently I inject the HttpServletRequest
as a method parameter and then get the IP address.
I want to make my code cleaner. I am thinking if I can use a MessageBodyReader
class and set the IP address. But if I use a MessageBodyReader
I have to unmarshall the XML to a Java object which is additional logic as far as I believe.
Can anyone please let me know how to get the client IP address without having to inject the HttpServletRequest
.
回答1:
There's no magic. What you can do is wrap the HttpServletRequest into a CDI bean with request scope (@RequestScoped) and then inject this bean into your JAX-RS resource classes:
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();
}
}
I know this approach is not much different from injecting the HttpServletRequest. But there's no magic.
来源:https://stackoverflow.com/questions/38243446/how-to-get-the-client-ip-address-in-a-jax-rs-resource-class-without-injecting-th