2016-07-07 7 views
0

Мы используем JAX-RS 1.0, и я хочу получить IP-адрес клиента в своем классе ресурсов. В настоящее время я вставляю HttpServletRequest в качестве параметра метода, а затем получаю IP-адрес.Как получить IP-адрес клиента в классе ресурсов JAX-RS без ввода HttpServletRequest?

Я хочу сделать мой код чище. Я думаю, если я могу использовать класс MessageBodyReader и установить IP-адрес. Но если я использую MessageBodyReader, я должен развязать XML к объекту Java, который, насколько мне кажется, является дополнительной логикой.

Может кто-нибудь, пожалуйста, дайте мне знать, как получить IP-адрес клиента, не вводя HttpServletRequest.

+0

В чем проблема при введении «HttpServletRequest»? Рассматривали ли вы инъекцию в качестве своего класса ресурсов? –

+0

Вы можете использовать 'http: // checkip.amazonaws.com' –

+0

@DibakarPaul Он вернет ваш собственный IP вместо IP-адреса клиента. –

ответ

2

Нет никакой магии. Что вы можете сделать, это обернуть HttpServletRequest в КДИ боба с запросом объема (@RequestScoped), а затем вводить этот компонент в свой 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. Но нет волшебства.

+1

Спасибо Кассио. Между тем я создал абстрактный класс и ввел запрос в него с помощью @Context и добавил защищенный метод для получения ip-адреса. Я еще не тестировал его, но надеется, что он работает так, как ожидалось –