Signaler

Comment obtenir l'@ IP d'un client de service web en Java? [Résolu]

Posez votre question chercheur2017 48Messages postés mardi 18 avril 2017Date d'inscription 4 juillet 2017 Dernière intervention - Dernière réponse le 11 mai 2017 à 17:02 par chercheur2017
Bonjour,

j'ai créé un service web en utilisant l'IDE Eclipse (Luna), le serveur Tomcat 8 et l'outil Axis 2. Il s'agit du service le plus simple qui effectue la somme de deux entiers. Pour cela, j'ai créé en java une classe 'AddOperator' qui définit le service et dont le contenu est le suivant:
public class AddOperator {
	public int add (int x,int y){
		return x+y;
	
	}


j'ai créé aussi un client qui consomme le service en question à l'aide de la classe 'AddClientOpp' et dont le code est le suivant:
public class AddClientOpp {

	public static void main(String[] args) throws RemoteException  {
		AddOperatorStub stub = new AddOperatorStub();
		
		Add add = new Add();
		add.setX(25);
		add.setY(30);
		
		
		System.out.println(stub.add(add).get_return());
	
         }
}

j'ai testé, et ça marche très bien.

maintenant, j'ai besoin de récupérer l'adresse IP du client qui a consommé mon service web. J'ai cherché et j'ai trouvé quelques méthodes et portions de codes qui permette de le faire, telles que:

import javax.servlet.http.HttpServletRequest;

	//...

	private static String getClientIp(HttpServletRequest request) {

        String remoteAddr = "";

        if (request != null) {
            remoteAddr = request.getHeader("X-FORWARDED-FOR");
            if (remoteAddr == null || "".equals(remoteAddr)) {
                remoteAddr = request.getRemoteAddr();
            }
        }

        return remoteAddr;
    }


ou encore:

import java.net.*;
import java.io.*;
import java.applet.*;

public class GetClientIP extends Applet {
  public void init() {
    try {
     InetAddress Ip =InetAddress.getLocalHost();
     System.out.println("IP:"+Ip.getHostAddress());
     }
    catch(Exception e) {
     e.printStackTrace();
     }
    }
}


mais je ne sais pas où dois-je intégrer ces portion de codes ou ces méthodes au niveau de mon processus de création de service web décrit plus haut!!

si quelqu'un a une réponse, prière de me tenir au courant.

Merci :)
Afficher la suite 
Utile
+0
plus moins
Bonjour,

InetAddress.getLocalHost()
c'est faux, ça va te renvoyer l'adresse IP de ton serveur, pas du client.

request.getHeader("X-FORWARDED-FOR");
est mieux, même s'il est à noter qu'il peut contenir plusieurs adresses IP, et que d'autres adresses IP peuvent se trouver dans d'autres headers.

"j'ai créé un service web"
Le code que tu nous montre (avec une méthode main) ce n'est pas un service web, mais une application Java standard, c'est donc normal que tu n'arrives pas à intégrer le code dedans.

Normalement le point d'entrée de tes appels web service c'est une servlet (une AxisServlet dans ton cas ?), c'est à ce niveau que tu peux récupérer l'ensemble des informations de la requête effectuée au serveur.
KX 14643Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 27 juillet 2017 Dernière intervention - 10 mai 2017 à 13:44
Alors maintenant que ton serveur fonctionne, tu vas pouvoir modifier le code pour ajouter la récupération de l'adresse IP.

Je remets le code ici, pour les explications voir le début de la discussion (#1 et #2)

package ccm.kx;

import javax.servlet.ServletRequest;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;

public class SimpleService {
    public String helloService(String msg) {
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServletRequest request = (ServletRequest) mc.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
        return "Hello " + msg + " " + request.getRemoteAddr();
    }
}
Répondre
chercheur2017 48Messages postés mardi 18 avril 2017Date d'inscription 4 juillet 2017 Dernière intervention - 10 mai 2017 à 14:30
justement, c'est ce que j'ai fait. J'obtiens le message "Hello..." mais à la fin je n'ai pas l'adresse IP. Veut dire que j'ai réussi à invoquer la méthode 'helloService' de la classe SimpleService sauf qu'elle me retourne pas tout le résultat attendu.(à noter aussi que je travaille sur IPv4).
Répondre
chercheur2017 48Messages postés mardi 18 avril 2017Date d'inscription 4 juillet 2017 Dernière intervention KX - 10 mai 2017 à 17:44
C'est bon, je me retrouve. je ne savais pas que la classe SimpleService se génère automatiquement dès la création d'un projet maven. j'ai modifié la classe et j'ai obtenu le même résultat que le tien. mais je m'attendais à avoir l'@ IP de mon propre PC .Pour moi, mon PC représente le client ayant consommé le service localement. je sais que je suis passé à côté de la plaque, stp orientes-moi vers un bon support sur les service web (création, client,...). je pense que j'ai commencé à apprendre les service web en se basant sur de mauvais support.

Si, par exemple, je veux créer ma propre classe (mon propre code) qui représente mon propre service. comment dois-je procéder? comment créer un client qui consomme ce service? et comment avoir l'@ IP de ce client?
Répondre
KX 14643Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 27 juillet 2017 Dernière intervention - 10 mai 2017 à 19:16
"je m'attendais à avoir l'@ IP de mon propre PC"
Un PC peut avoir plusieurs adresses IP, cela dépend sur quel réseau on se place.

Ici on interroge le service sur http://localhost:8080 (sur un réseau local au PC), donc l'adresse IP sera forcément soit 0:0:0:0:0:1 en IPv6 soit 127.0.0.1 en IPv4.
Si maintenant tu veux tester sur ton réseau familial (ta box par exemple) ou d'entreprise tu devras taper sur l'adresse IP du serveur dans ce réseau, utilises la commande
ipconfig
pour connaître l'adresse, exemple http://192.168.1.1:8080
Dans ce cas, et sans rien changer en code, le résultat du webservice va changer et renvoyer un résultat adapté au niveau réseau considéré.

NB. Pour tester le mieux est bien sûr d'avoir 2 PC, pour que le client et le serveur n'aient pas la même adresse IP et vérifier que le résultat correspond bien à l'adresse du client et non pas à celle du serveur.

"à noter aussi que je travaille sur IPv4"
Cela dépendra de ton réseau, si ton réseau est en IPv4 tu auras une adresse en IPv4, s'il est en IPv6 tu auras une adresse en IPv6.

"je pense que j'ai commencé à apprendre les service web en se basant sur de mauvais support"
Une question que je me pose c'est : pourquoi Axis ?
C'est clairement une technologie qui a fait ses preuves et toujours utile dans certains cas, mais à des fins d'apprentissage je n'aurais pas commencé par là...

Ici le tutoriel Oracle sur la programmation de web services Java EE 7
https://docs.oracle.com/javaee/7/tutorial/partwebsvcs.htm#BNAYK

En gros il y a deux catégories de web services :
  • JAX-WS pour faire du SOAP (avec du bon vieux XML)
  • JAX-RS pour faire du REST (généralement en JSON, mais pas seulement)

À conseiller, c'est plutôt sur du REST que je partirais, aussi bien en terme d'apprentissage, que pour des projets petits ou gros, y compris professionnels.
C'est notamment bien adapté pour communiquer avec les "nouveaux" frameworks JavaScript (Angular, Ember, etc.) ou les applis mobiles qui peuvent bien intéragir avec du REST alors que le SOAP est plutôt fait pour la communication entre deux serveurs, pas avec des clients finaux.

Le tutoriel de Java EE cité plus haut est bien fait mais pas forcément très facile à prendre en main, en voici un autre qu'il peut être intéressant de consulter pour bien démarrer : https://jersey.java.net/documentation/latest/user-guide.html
Répondre
chercheur2017 48Messages postés mardi 18 avril 2017Date d'inscription 4 juillet 2017 Dernière intervention - 11 mai 2017 à 17:02
Merci pour cette explication. Je prendrai tout ça en considération.
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !