2010-09-29 25 views
17

J'écris un service Web Java Rest et j'ai besoin de l'adresse IP de l'appelant. Je pensais avoir vu cela dans le cookie une fois mais maintenant je ne le vois pas. Y a-t-il un endroit cohérent pour obtenir cette information?Repos - comment obtenir l'adresse IP de l'appelant

J'ai vu un exemple d'utilisation d'un "OperationalContext" pour l'obtenir mais ce n'était pas en Java.

+0

Bienvenue sur SO. Je pense que vous devez ajouter des balises Java pour gagner une audience - ce n'est pas vraiment lié à REST –

+0

Peut-être pas directement Reste lié, mais certainement lié aux services web (que je ne connais pas beaucoup non plus), n'est-ce pas? Ne serait-ce pas un problème de repos/service Web de connaître l'adresse IP du client Web qui envoient votre service? – Wanderer

+0

Première question, comment créez-vous votre application RESTful? Avec des servlets, une bibliothèque, etc? –

Répondre

11

Je pense que vous pouvez obtenir l'adresse IP via l'objet de requête. Si je ne me trompe pas, request.getRemoteAddr() ou ainsi de suite.

+0

Peut-être qu'il me manque quelque chose, mais je n'ai pas d'objet de requête. Ceci est un service JAX-RS Restful Web. J'ai accès à un objet de contexte Request, mais cela n'a pas de méthode getRemoteAddr() et semble être lié à "Gets conditionnels" ... quels qu'ils soient. – Wanderer

+4

Hm .. ne pouvez-vous pas faire quelque chose comme demande @Context HttpServletRequest et ensuite utiliser cet objet request.getRemoteAddr()? – kukudas

1

En supposant que vous faites votre "service web" avec des servlets, l'appel de méthode plutôt simple .getRemoteAddr() sur l'objet de requête vous donnera l'adresse IP des appelants.

+0

oh vous étiez plus rapide :) – kukudas

+0

Non servlets, mais Restful Web Services (différent, non?) Et je n'ai pas d'objet qui a une méthode getremoteAddr(). – Wanderer

30

Injecter HttpServletRequest dans votre service de repos en tant que tel:

import javax.servlet.http.HttpServletRequest; 

@GET 
@Path("/yourservice") 
@Produces("text/xml") 
public String activate(@Context HttpServletRequest requestContext,@Context SecurityContext context){ 

    String ipAddressRequestCameFrom = requestContext.getRemoteAddr(); 

    //Also if security is enabled 
    Principal principal = context.getUserPrincipal(); 
    String userName = principal.getName(); 

} 
+3

'requestContext.getRemoteAddr()' suffira (sans 'toString()') –

4

Vous pouvez faire quelque chose comme ceci:

@WebService 
public class YourService { 

    @Resource 
    WebServiceContext webServiceContext; 

    @WebMethod 
    public String myMethod() { 

     MessageContext messageContext = webServiceContext.getMessageContext(); 
     HttpServletRequest request = (HttpServletRequest) messageContext.get(MessageContext.SERVLET_REQUEST); 
     String callerIpAddress = request.getRemoteAddr(); 

     System.out.println("Caller IP = " + callerIpAddress); 

    } 
}