Géolocalisation par IP en Java

Géolocalisation par IP en Java

1. introduction

Dans cet article, nous verrons comment obtenir des données de localisation géographique à partir d'une adresse IP à l'aide de l'API Java MaxMind GeoIP2 avec la base de données gratuite GeoLite2.

Nous verrons également cela en action en utilisant une simple application de démonstration Web Spring MVC.

2. Commencer

Pour commencer, vous devez télécharger l'API GeoIP2 et la base de données GeoLite2 à partir de MaxMind.

2.1. Dépendance Maven

Pour inclure l'API MaxMind GeoIP2 dans votre projet Maven, ajoutez ce qui suit au fichierpom.xml:


    com.maxmind.geoip2
    geoip2
    2.8.0

Pour obtenir la dernière version de l'API, vous pouvez la trouver surMaven Central.

2.2. Téléchargement de la base de données

Ensuite, vous devrez télécharger lesGeoLite2 database. Pour ce tutoriel, nous utilisons la version binaire gzippée de la base de données GeoLite2 City.

Après avoir déballé l'archive, vous aurez un fichier nomméGeoLite2-City.mmdb. Il s'agit d'une base de données de mappages d'IP à emplacement dans le format binaire propriétaire MaxMind.

3. Utilisation de l'API Java GeoIP2

Utilisons l’API Java GeoIP2 pour récupérer les données de localisation d’une adresse IP donnée dans la base de données. Commençons par créer unDatabaseReader pour interroger la base de données:

File database = new File(dbLocation);
DatabaseReader dbReader = new DatabaseReader.Builder(database).build();

Ensuite, utilisons la méthodecity() pour obtenir les données de ville pour une adresse IP:

CityResponse response = dbReader.city(ipAddress);

L'objetCityResponse contient plusieurs informations autres que le nom de la ville. Voici un exemple de test JUnit montrant comment ouvrir la base de données, récupérer les informations de ville pour une adresse IP et extraire ces informations desCityResponse:

@Test
public void givenIP_whenFetchingCity_thenReturnsCityData()
  throws IOException, GeoIp2Exception {
    String ip = "your-ip-address";
    String dbLocation = "your-path-to-mmdb";

    File database = new File(dbLocation);
    DatabaseReader dbReader = new DatabaseReader.Builder(database)
      .build();

    InetAddress ipAddress = InetAddress.getByName(ip);
    CityResponse response = dbReader.city(ipAddress);

    String countryName = response.getCountry().getName();
    String cityName = response.getCity().getName();
    String postal = response.getPostal().getCode();
    String state = response.getLeastSpecificSubdivision().getName();
}

4. Utilisation de GeoIP dans une application Web

Examinons un exemple d'application Web qui récupère les données de géolocalisation à partir de l'adresse IP publique d'un utilisateur et affiche l'emplacement sur une carte.

Nous allons commencer par unbasic Spring Web MVC Application. Nous allons ensuite écrire unController qui accepte une adresse IP dans une requête POST et renvoie une réponse JSON contenant la ville, la latitude et la longitude déduites de l'API GeoIP2.

Enfin, nous allons écrire du HTML et du JavaScript qui chargeront l'adresse IP publique de l'utilisateur dans le formulaire, soumettrons une requête Ajax POST à ​​nosController et afficherons le résultat dans Google Maps.

4.1. La classe d'entité de réponse

Commençons par définir la classe qui contiendra la réponse de géolocalisation:

public class GeoIP {
    private String ipAddress;
    private String city;
    private String latitude;
    private String longitude;
    // constructors, getters and setters...
}

4.2. La classe de service

Écrivons maintenant la classe de service qui récupère les données de géolocalisation à l'aide de l'API Java GeoIP2 et de la base de données GeoLite2:

public class RawDBDemoGeoIPLocationService {
    private DatabaseReader dbReader;

    public RawDBDemoGeoIPLocationService() throws IOException {
        File database = new File("your-mmdb-location");
        dbReader = new DatabaseReader.Builder(database).build();
    }

    public GeoIP getLocation(String ip)
      throws IOException, GeoIp2Exception {
        InetAddress ipAddress = InetAddress.getByName(ip);
        CityResponse response = dbReader.city(ipAddress);

        String cityName = response.getCity().getName();
        String latitude =
          response.getLocation().getLatitude().toString();
        String longitude =
          response.getLocation().getLongitude().toString();
        return new GeoIP(ip, cityName, latitude, longitude);
    }
}

4.3. Le contrôleur de ressort

Jetons un coup d'œil auxController pour Spring MVC qui envoie le paramètre de requête "ipAddress" à notre classe de service pour obtenir les données de réponse de géolocalisation:

@RestController
public class GeoIPTestController {
    private RawDBDemoGeoIPLocationService locationService;

    public GeoIPTestController() throws IOException {
        locationService = new RawDBDemoGeoIPLocationService();
    }

    @PostMapping("/GeoIPTest")
    public GeoIP getLocation(
      @RequestParam(value="ipAddress", required=true) String ipAddress
    ) throws Exception {

        GeoIPLocationService locationService
          = new RawDBDemoGeoIPLocationService();
        return locationService.getLocation(ipAddress);
    }
}

4.4. Le formulaire HTML

Ajoutons le code frontal pour appeler nos SpringController, commençant par un formulaire HTML contenant l'adresse IP:


    
...

4.5. Chargement de l'adresse IP publique sur le client

Préremplissons maintenant le champ de texte "ipAddress" avec l'adresse IP publique de l'utilisateur, à l'aide de jQuery et de l'API JavaScript deipify.org:



4.6. Soumettre la requête Ajax POST

Lorsque le formulaire est soumis, nous ferons une requête Ajax POST aux SpringController pour récupérer la réponse JSON avec les données de géolocalisation:

$( "#ipForm" ).submit(function( event ) {
    event.preventDefault();
    $.ajax({
        url: "GeoIPTest",
        type: "POST",
        contentType:
         "application/x-www-form-urlencoded; charset=UTF-8",
        data: $.param( {ipAddress : $("#ip").val()} ),
        complete: function(data) {},
        success: function(data) {
            $("#status").html(JSON.stringify(data));
            if (data.ipAddress !=null) {
                showLocationOnMap(data);
            }
        },
        error: function(err) {
            $("#status").html("Error:"+JSON.stringify(data));
            },
        });
});

4.7. Exemple de réponse JSON

La réponse JSON de nos SpringController aura le format suivant:

{
    "ipAddress":"your-ip-address",
    "city":"your-city",
    "latitude":"your-latitude",
    "longitude":"your-longitude"
}

4.8. Affichage de la position sur Google Maps

Pour afficher la position sur Google Maps, vous devez inclure l'API Google Maps dans votre code HTML:

Vous pouvez obtenir une clé API pour Google Maps à l'aide de la console développeur de Google.

Vous devrez également définir une balise HTML<div> pour contenir l'image de la carte:

Vous pouvez utiliser la fonction JavaScript suivante pour afficher les coordonnées sur Google Maps:

function showLocationOnMap (location) {
    var map;
    map = new google.maps.Map(document.getElementById('map'), {
      center: {
        lat: Number(location.latitude),
        lng: Number(location.longitude)},
        zoom: 15
    });
    var marker = new google.maps.Marker({
      position: {
        lat: Number(location.latitude),
        lng: Number(location.longitude)},
        map: map,
        title:
          "Public IP:"+location.ipAddress
            +" @ "+location.city
    });
}

Après avoir démarré l'application Web, ouvrez l'URL de la page de carte:

http://localhost:8080/spring-mvc-xml/GeoIpTest.jsp

Vous verrez l'adresse IP publique actuelle de votre connexion chargée dans la zone de texte:

image

Notez que GeoIP2 et ipify prennent en charge les adresses IPv4 ainsi que les adresses IPv6.

Lorsque vous envoyez le formulaire, vous verrez le texte de la réponse JSON, y compris la ville, la latitude et la longitude correspondant à votre adresse IP publique, et en dessous, vous verrez une carte Google indiquant votre emplacement:

image

5. Conclusion

Dans ce didacticiel, nous avons examiné l'utilisation de l'API Java MaxMind GeoIP2 et de la base de données gratuite MaxMind GeoLite2 City à l'aide d'un test JUnit.

Ensuite, nous avons construit un Spring MVCController et un service pour obtenir les données de géolocalisation (ville, latitude, longitude) à partir d'une adresse IP.

Enfin, nous avons créé un frontal HTML / JavaScript pour montrer comment cette fonctionnalité peut être utilisée pour afficher la position d'un utilisateur sur Google Maps.

Ce produit comprend des données GeoLite2 créées par MaxMind, disponibles à partir dehttp://www.maxmind.com.

Le code de ce didacticiel se trouve sur lesGithub site.