How to get the client IP address in a JAX-RS resource class without injecting the HttpServletRequest?

守給你的承諾、 提交于 2021-01-24 12:07:55

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!