Comment obtenir l'@ IP d'un client de service web en Java?

Résolu/Fermé
chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 - 7 mai 2017 à 16:45
chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 - 11 mai 2017 à 17:02
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 :)

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
7 mai 2017 à 18:20
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.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
7 mai 2017 à 19:01
Exemple, avec l'archetype Maven dont on parlait dans ta discussion précédente.

mvn archetype:generate -DarchetypeGroupId=org.apache.axis2.archetype -DarchetypeArtifactId=quickstart-webapp -DgroupId=ccm.kx -DartifactId=axis -DinteractiveMode=false

On modifie un petit peu la classe SimpleService pour rajouter l'adresse IP :

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();
  }
}

On compile et on démarre le serveur :
mvn clean package jetty:run

Et on appelle http://localhost:8080/services/SimpleService/helloService?msg=KX

Ce qui donne :
<ns:helloServiceResponse xmlns:ns="http://kx.ccm">
<ns:return>Hello KX 0:0:0:0:0:0:0:1</ns:return>
</ns:helloServiceResponse>

0:0:0:0:0:0:0:1
étant l'adresse IPv6 correspondant à localhost
0
chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 4 > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
8 mai 2017 à 16:56
Bonjour KX, et merci pour ton aide. je suis débutant et ça me motive vraiment à apprendre encore.

Seulement, j'ai eu encore quelque difficulté vu que je ne programme pas trop (j'occupe un poste de chercheur).
Concernant l'exemple que tu m'a envoyé, j'ai commencé par taper la ligne de commande lié à Maven sur la console et ça c'est bien déroulé (succès). par la suite, j'ai écrit la classe SimpleService sur un bloc note pour la tester d'abord. je compile sur la console et j'obtient 8 erreurs que j'ai pu réduire en 5 (après avoir attribué le chemin du fichier servlet.jar à la variable CLASSPATH). les erreurs qui restent sont liées principalement aux 'import' de la ligne 5 et 6 (package does not exist). j'ai cherché mais je n'est pas pu résoudre le problème!!
si tu a une idée sur ça, prière de me tenir au courant et de me décrire plus clairement les étapes à suivre si possible (vu que je ne programme pas trop).

merci pour ton aide et ta compréhension.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018
8 mai 2017 à 18:41
" j'ai écrit la classe SimpleService sur un bloc note pour la tester d'abord"
Ça n'a pas de sens de tester un code serveur sur un programme client, car toute la "magie" vient de ce qui est fourni par le serveur.
Il faut bien comprendre qu'au final le programme qui fonctionnera ce n'est pas le war, mais le serveur Tomcat (ou Jetty, ou autre) mais le war tout seul (ou pire, une classe de ce war tout seul) ne peut pas fonctionner sans le serveur qui s'exécute derrière.

"les erreurs qui restent sont liées principalement aux 'import'"
La première ligne de commande génère un projet d'exemple, la classe SimpleService existe déjà dedans (dans le répertoire src/main ) et ses imports sont configurés dans le pom.xml de manière à ce que le projet puisse compiler et être exécuté tel quel, sans problème. Tu n'as donc rien de plus à faire pour que ça fonctionne. Juste les deux commandes Maven que je t'ai donné.

"après avoir attribué le chemin du fichier servlet.jar à la variable CLASSPATH"
C'est inutile et de manière générale utiliser variable CLASSPATH est une mauvaise pratique, c'est pour cela que Maven gère ses dépendances directement au sein de la configuration de son projet (dans le fichier pom.xml)

Tu peux tester directement comme ceci (en repartant de zéro)
mvn archetype:generate -DarchetypeGroupId=org.apache.axis2.archetype -DarchetypeArtifactId=quickstart-webapp -DgroupId=ccm.kx -DartifactId=axis -DinteractiveMode=false
cd axis
mvn clean package jetty:run
http://localhost:8080/services/SimpleService/helloService?msg=KX

Reste juste à faire les modifications spécifiques pour avoir l'adresse IP.
0
chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 4 > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
9 mai 2017 à 15:19
Salut KX,

J'ai réessayé l'exemple, et quand je lance la dernière commande 'mvn clean package jetty:run', au début ça commence à s'exécuter, et par la suite le curseur se met à clignoter sans avoir terminé l'exécution et ça ne se débloque pas!!!
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > chercheur2017 Messages postés 56 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018
9 mai 2017 à 19:10
Bonjour,

"le curseur se met à clignoter sans avoir terminé l'exécution"
La dernière log avant le curseur c'est
[INFO] Started Jetty Server
?
Alors c'est tout à fait normal :-)

Il n'y a pas de fin d'exécution sur un serveur web, il traite les requêtes au fur et à mesure qu'il les reçoit jusqu'à ce qu'on arrête explicitement le serveur.
Donc dès que le serveur est démarré tu peux utiliser le serveur, par exemple :
http://localhost:8080/services/SimpleService/helloService?msg=KX

Dans le projet d'exemple il n'y a pas de logs, mais s'il y en avait, elles apparaîtraient au fur et à mesure car c'est la console du serveur (System.out et System.err) donc tous les messages viendraient s'y afficher.

Après comment arrêter le serveur, au choix :
  • brutalement avec un Ctrl+C. Dans la plupart des cas (comme ici) ça n'a aucune importance, le serveur se coupe et c'est fini (c'est un peu crado, mais pour le developpement au quotidien ça suffit). Ça pourrait juste poser problème si tu as des traitements encore en cours ou une tâche programmée à l'arrêt du serveur (car elle ne serait pas exécutée)
  • soigneusement, avec une commande
    mvn jetty:stop
    (en ouvrant un autre terminal à côté). Mais il faut au préalable faire une petite configuration dans le pom.xml pour remplacer le (vieux) plugin jetty qui est configuré dans l'exemple.

Pour utiliser
mvn jetty:stop
, remplacer dans le pom.xml les lignes 64 à 72 par :
<plugin>
	<groupId>org.eclipse.jetty</groupId>
	<artifactId>jetty-maven-plugin</artifactId>
	<version>9.4.5.v20170502</version>
	<configuration>
		<stopPort>8089</stopPort>
		<stopKey>toto</stopKey>
		<stopWait>10</stopWait>
	</configuration>
</plugin>

Remarque : on pourrait aussi en profiter pour ajouter un plugin Tomcat, mais autant que je sache il n'est plus maintenu, le dernier date de Tomcat 7.
Jetty fait de toute façon exactement le même travail, donc pour une phase de développement ça suffit.
De toute façon que le war soit déployé sur un Tomcat, un Jetty, ou un autre serveur Java, ça ne change pas grand chose tant qu'on ne fait pas de configuration spécifique pour un serveur cible en particulier.
0