2016-07-07 1 views
0

Nous utilisons JAX-RS 1.0 et je veux obtenir l'adresse IP du client dans ma classe de ressources. Actuellement, j'injecte le HttpServletRequest comme paramètre de méthode, puis j'obtiens l'adresse IP.Comment obtenir l'adresse IP du client dans une classe de ressources JAX-RS sans injecter le HttpServletRequest?

Je veux rendre mon code plus propre. Je pense si je peux utiliser une classe MessageBodyReader et définir l'adresse IP. Mais si j'utilise un MessageBodyReader je dois unmarshall le XML à un objet Java qui est la logique supplémentaire autant que je crois.

Quelqu'un peut-il s'il vous plaît laissez-moi savoir comment obtenir l'adresse IP du client sans avoir à injecter le HttpServletRequest.

+0

Quel est le problème lors de l'injection de 'HttpServletRequest'? Avez-vous envisagé de l'injecter dans un champ de votre classe de ressources? –

+0

Vous pouvez utiliser 'http: // checkip.amazonaws.com' –

+0

@DibakarPaul Il renverra votre propre adresse IP au lieu de l'adresse IP du client. –

Répondre

2

Il n'y a pas de magie. Ce que vous pouvez faire est envelopper le HttpServletRequest dans un grain de CDI avec la portée de la demande (@RequestScoped), puis injecter ce haricot dans vos classes de ressources 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(); 
    } 
} 

Je sais que cette approche ne diffère pas beaucoup d'injecter le HttpServletRequest. Mais il n'y a pas de magie.

+1

Merci Cassio. Pendant ce temps, j'ai créé une classe abstraite et j'ai injecté la requête dans celle-ci en utilisant @Context et ajouté une méthode protégée pour obtenir l'adresse IP. Je ne l'ai pas encore testé mais espère que cela fonctionne comme prévu –