Si le logiciel proxy inversé est utilisé, lors de la proxie de l'inverse, l'URL de http://192.168.1.110:2046/ à l'URL de http://www.xxx.com/, utilisez la méthode request.getRemoteaddr () pour obtenir l'IP Adresse obtenue en utilisant la méthode request.getRemoteaddr () C'est: 127.0.0.1 ou 192.168.1.110, pas la véritable IP du client.
Après avoir passé le proxy, puisque une couche intermédiaire est ajoutée entre le client et le service, le serveur ne peut pas obtenir directement l'IP du client et l'application côté serveur ne peut pas revenir directement au client via l'adresse de transfert. Cependant, dans les informations de l'en-tête HTTP sur le transfert de la demande, des informations X-Forwared-for sont ajoutées. Utilisé pour suivre l'adresse IP du client d'origine et l'adresse du serveur demandé par le client d'origine. Lorsque nous accédons à http://www.xxx.com/index.jsp/, ce n'est pas notre navigateur qui accède réellement le fichier index.jsp sur le serveur, mais le serveur proxy accède d'abord à Http: //192.168. 2046 / index.jsp, le serveur proxy renvoie le résultat accessible à notre navigateur. le serveur proxy, pas l'adresse IP du client.
Ensuite, une méthode d'obtention de l'adresse IP réelle du client peut être obtenue:
La copie de code est la suivante:
Public String getReMORTIP (demande httpservletRequest) {
if (request.getheader ("x-forwarded-for") == null) {
return request.getReMoteaddr ();
}
return request.getheader ("X-Forwarded-for");
}
Mais lorsque je visite http://www.xxx.com/index.jsp/, l'adresse IP retournée est toujours inconnue, pas 127.0.0.1 ou 192.168.1.110 comme indiqué ci-dessus, et je visite http: // quand /192.168. 1.110: 2046 / index.jsp, la véritable adresse IP du client peut être renvoyée et une méthode est écrite pour vérifier. La raison réside dans le calmar. L'élément FullEd_For dans le fichier de configuration Squid.Conf Fairided_For est par défaut sur ON.
Par conséquent, la deuxième méthode pour obtenir la véritable adresse IP du client peut être obtenue:
La copie de code est la suivante:
String public getIpAddr (requête httpservletRequest) {
String ip = request.getheader ("x-Forwarded-for");
if (ip == null || ip.length () == 0 || "inconnu" .equalSignoreCase (ip)) {
ip = request.getheader ("proxy-client-ip");
}
if (ip == null || ip.length () == 0 || "inconnu" .equalSignoreCase (ip)) {
ip = request.getheader ("wl-proxy-client-ip");
}
if (ip == null || ip.length () == 0 || "inconnu" .equalSignoreCase (ip)) {
ip = request.getRemoteaddr ();
}
retourner ip;
}
Cependant, si un proxy inverse à plusieurs niveaux est passé, il y a plus d'une valeur de X-Forwarded-for, mais une chaîne de valeurs IP.
La réponse consiste à prendre la première chaîne IP valide non sous-vernale dans X-Forwarded-For.
comme:
La copie de code est la suivante:
X-Forwarded-For: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
La véritable propriété intellectuelle de l'utilisateur est: 192.168.1.110