Environnement : jdk1.8 + idea2019.3 + Windows10
Lors du développement du projet, lors du traitement quotidien des journaux d'opérations, l'enregistrement des journaux d'opérations des utilisateurs est essentiellement réalisé via l'aspect AOP, mais lorsqu'il s'agit d'enregistrer les journaux d'opérations , il doit y avoir un Les éléments sont essentiellement enregistrés pour référence, c'est-à-dire l'adresse IP client de l'opérateur. Il est également pratique de vérifier "sale" à l'avenir.
Puis la question vient. Comment obtenez-vous spécifiquement l’adresse IP du client ? Hahaha, c'est mon contenu pédagogique dans ce numéro. Si certains amis savent comment l'obtenir, alors je tiens à vous féliciter, mais les idées de mise en œuvre sont-elles différentes des miennes ? Vous pouvez donc également essayer de voir comment les bactéries bugs sont mises en œuvre.
Ensuite, je vais commencer à enseigner, il faut écouter attentivement.
La première étape : Définissons d'abord une classe d'outils spécifiquement pour l'encapsulation Classes de méthodes liées à IP.
package com.example.review.util; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; /** * ip相关工具类 * * @Author luoYong * @Date 2022-03-30 17:16 */ public class IpUtils { }
La deuxième étape : est au cœur de ce tutoriel, alors comment obtenir l'IP du client ? Je ne le vendrai plus.
Habituellement, l'adresse IP du client est obtenue via request.getRemoteAddr() , n'est-ce pas, mais y avez-vous déjà pensé ? De nos jours, les systèmes de base effectueront un proxy de nom de domaine, etc. Par exemple, grâce à des logiciels de proxy inverse tels qu'Apache et Squid, il est impossible d'obtenir la véritable adresse IP du client à l'aide de getRemoteAddr().
Pourquoi ne puis-je pas l'obtenir après avoir ajouté un agent ? En effet, un proxy intermédiaire est ajouté entre le client et le service, de sorte que le serveur ne peut pas obtenir directement l'adresse IP du client et que l'application côté serveur ne peut pas renvoyer directement l'adresse de la demande au client en la transmettant. la méthode d'obtention est directement A été adopté.
Si vous ne comprenez toujours pas, vous pouvez consulter le schéma de processus de l'agence ci-dessous et vous comprendrez.
Si vous limitez uniquement le système sans proxy, alors tout va bien. Il est fondamentalement impossible pour le système de ne pas agir comme un agent, alors que devons-nous faire ? Ne vous inquiétez pas, je vais vous dire comment jouer. Si vous n'arrivez toujours pas à l'obtenir après avoir utilisé mes méthodes d'enseignement, venez me battre, d'accord ?
Ce qui suit est la classe de méthode spécifique pour obtenir l'adresse IP du client : pour votre référence uniquement.
/*** * 获取客户端ip地址 * @param request */ public static String getIP(final HttpServletRequest request) throws Exception { if (request == null) { throw (new Exception("getIpAddr method HttpServletRequest Object is null")); } String ipStr = request.getHeader("x-forwarded-for"); if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ipStr.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ipStr = str; break; } } //目的是将localhost访问对应的ip 0:0:0:0:0:0:0:1 转成 127.0.0.1。 return ipStr.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipStr; }
Il convient de noter que lors du développement local, vous utilisez essentiellement le nom d'hôte standard [localhost] pour l'accès à l'interface, n'est-ce pas ? Vous serez alors particulièrement curieux de connaître l'adresse IP du journal de la base de données dans une colonne. , certaines adresses IP se sont avérées être 0:0:0:0:0:0:0:1.
Pourquoi l'IP est-elle obtenue ainsi ? En effet, 0:0:0:0:0:0:0:1 est la représentation de [ipv6], ce qui équivaut à 127.0.0.1 pour [ipv4], qui est la machine locale. Donc, à la fin, j'ai converti de force l'adresse ipv6 en adresse ipv4 via l'arithmétique trinoculaire. Tout le monde peut-il comprendre cela ? Si vous ne comprenez pas, il n’est pas impossible de revenir en arrière et de bricoler le réseau informatique.
Voici les enregistrements du journal des opérations enregistrés dans la base de données pour l'accès à l'interface via l'hôte local et l'adresse IP réelle respectivement.
Ci-joint une capture d'écran de la base de données IP locale :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!