Geolocatie via IP in Java

1. Inleiding

In dit artikel zullen we onderzoeken hoe u geografische locatiegegevens van een IP-adres kunt krijgen met behulp van de MaxMind GeoIP2 Java API met de gratis GeoLite2-database.

We zullen dit ook in actie zien met behulp van een eenvoudige Spring MVC Web-demo-applicatie.

2. Aan de slag

Om te beginnen, moet u de GeoIP2 API en GeoLite2-database downloaden van MaxMind.

2.1. Afhankelijkheid van Maven

Om de MaxMind GeoIP2 API in uw Maven-project op te nemen, voegt u het volgende toe aan het pom.xml het dossier:

 com.maxmind.geoip2 geoip2 2.8.0 

Om de nieuwste versie van de API te downloaden, kun je deze vinden op Maven Central.

2.2. De database downloaden

Vervolgens moet u de GeoLite2-database downloaden. Voor deze tutorial gebruiken we de binaire gzip-versie van de GeoLite2 City-database.

Nadat je het archief hebt uitgepakt, heb je een bestand met de naam GeoLite2-City.mmdb. Dit is een database met IP-naar-locatietoewijzingen in het gepatenteerde binaire MaxMind-formaat.

3. Met behulp van de GeoIP2 Java API

Laten we de GeoIP2 Java API gebruiken om locatiegegevens voor een bepaald IP-adres uit de database op te halen. Laten we eerst een DatabaseReader om de database te doorzoeken:

Bestandsdatabase = nieuw bestand (dbLocation); DatabaseReader dbReader = nieuwe DatabaseReader.Builder (database) .build ();

Laten we vervolgens de stad() methode om de stadsgegevens voor een IP-adres te verkrijgen:

CityResponse-antwoord = dbReader.city (ipAddress);

De CityResponse object bevat verschillende soorten informatie behalve alleen de naam van de stad. Hier is een voorbeeld van een JUnit-test die laat zien hoe u de database opent, de stadsinformatie voor een IP-adres ophaalt en deze informatie uit de CityResponse:

@ Test openbare ongeldig gegeven IP_whenFetchingCity_thenReturnsCityData () gooit IOException, GeoIp2Exception {String ip = "uw-ip-adres"; String dbLocation = "uw-pad-naar-mmdb"; Bestandsdatabase = nieuw bestand (dbLocation); DatabaseReader dbReader = nieuwe DatabaseReader.Builder (database) .build (); InetAddress ipAddress = InetAddress.getByName (ip); CityResponse-antwoord = dbReader.city (ipAddress); String countryName = response.getCountry (). GetName (); String cityName = response.getCity (). GetName (); String Postal = response.getPostal (). GetCode (); String staat = response.getLeastSpecificSubdivision (). GetName (); }

4. GeoIP gebruiken in een webapplicatie

Laten we eens kijken naar een voorbeeldwebtoepassing die geolocatiegegevens ophaalt van het openbare IP-adres van een gebruiker en de locatie op een kaart weergeeft.

We beginnen met een eenvoudige Spring Web MVC-applicatie. Dan schrijven we een Controller die een IP-adres accepteert in een POST-verzoek en een JSON-antwoord retourneert met de stad, breedtegraad en lengtegraad afgeleid van de GeoIP2 API.

Ten slotte zullen we wat HTML en JavaScript schrijven die het openbare IP-adres van de gebruiker in het formulier laden, een Ajax POST-verzoek indienen bij onze Controlleren geef het resultaat weer in Google Maps.

4.1. De Response Entity Class

Laten we beginnen met het definiëren van de klasse die het geolocatierespons zal bevatten:

openbare klasse GeoIP {privé String ipAddress; particuliere String stad; privé String-breedtegraad; private String lengtegraad; // constructeurs, getters en setters ...}

4.2. De serviceklasse

Laten we nu de serviceklasse schrijven die de geolocatiegegevens ophaalt met behulp van de GeoIP2 Java API en GeoLite2-database:

openbare klasse RawDBDemoGeoIPLocationService {privé DatabaseReader dbReader; openbare RawDBDemoGeoIPLocationService () gooit IOException {Bestandsdatabase = nieuw bestand ("uw-mmdb-locatie"); dbReader = nieuwe DatabaseReader.Builder (database) .build (); } openbare GeoIP getLocation (String ip) gooit IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName (ip); CityResponse-antwoord = dbReader.city (ipAddress); String cityName = response.getCity (). GetName (); String latitude = response.getLocation (). GetLatitude (). ToString (); String longitude = response.getLocation (). GetLongitude (). ToString (); retourneer nieuwe GeoIP (ip, cityName, latitude, longitude); }}

4.3. De Spring Controller

Laten we eens kijken naar de Controller voor Spring MVC die de "ipAddress" -verzoekparameter naar onze serviceklasse stuurt om de geolocatieresponsgegevens op te halen:

@RestController openbare klasse GeoIPTestController {privé RawDBDemoGeoIPLocationService locationService; openbare GeoIPTestController () gooit IOException {locationService = nieuwe RawDBDemoGeoIPLocationService (); } @PostMapping ("/ GeoIPTest") openbare GeoIP getLocation (@RequestParam (value = "ipAddress", required = true) String ipAddress) genereert uitzondering {GeoIPLocationService locationService = nieuwe RawDBDemoGeoIPLocationService (); return locationService.getLocation (ipAddress); }}

4.4. Het HTML-formulier

Laten we de front-end-code toevoegen om onze lente te bellen Verantwoordelijke, beginnend met een HTML-formulier met het IP-adres:

     ... 

4.5. Laden van het openbare IP-adres op de client

Laten we nu het tekstveld 'ipAddress' vooraf invullen met het openbare IP-adres van de gebruiker, met behulp van jQuery en de ipify.org JavaScript-API:

   $ (document) .ready (function () {$ .get ("//api.ipify.org?format=json", functie (data) {$ ("# ip"). val (data.ip);} ); ... 

4.6. Het Ajax POST-verzoek indienen

Wanneer het formulier is verzonden, doen we een Ajax POST-verzoek aan de lente Controller om het JSON-antwoord met geolocatiegegevens op te halen:

$ ("#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 ()}), compleet: functie (data) {}, succes: functie (data) {$ (" #status "). html (JSON.stringify (data)); if (data.ipAddress! = null) {showLocationOnMap (data);}}, error: function (err) {$ (" # status "). html ( "Error:" + JSON.stringify (data));},});});

4.7. Voorbeeld van een JSON-antwoord

De JSON-reactie van onze lente Controller zal het volgende formaat hebben:

{"ipAddress": "uw-ip-adres", "stad": "uw-stad", "latitude": "uw-latitude", "longitude": "uw-lengtegraad"}

4.8. De locatie weergeven op Google Maps

Om de locatie op Google Maps weer te geven, moet u de Google Maps API opnemen in uw HTML-code:

U kunt een API-sleutel voor Google Maps verkrijgen via de Google Developer Console.

U moet ook een HTML definiëren tag om de kaartafbeelding te bevatten:

U kunt de volgende JavaScript-functie gebruiken om de coördinaten op Google Maps weer te geven:

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

Open na het starten van de webapplicatie de URL voor de kaartpagina:

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

U zult het huidige openbare IP-adres voor uw verbinding zien geladen in het tekstvak:

Merk op dat zowel GeoIP2 als ipify zowel IPv4-adressen als IPv6-adressen ondersteunen.

Wanneer u het formulier verzendt, ziet u de JSON-antwoordtekst, inclusief de stad, breedtegraad en lengtegraad die overeenkomen met uw openbare IP-adres, en daaronder ziet u een Google Map die naar uw locatie verwijst:

5. Conclusie

In deze tutorial hebben we het gebruik van de MaxMind GeoIP2 Java API en de gratis MaxMind GeoLite2 City-database besproken met behulp van een JUnit-test.

Daarna hebben we een Spring MVC gebouwd Controller en service om de geolocatiegegevens (stad, breedtegraad, lengtegraad) van een IP-adres te verkrijgen.

Ten slotte hebben we een HTML / JavaScript-front-end gebouwd om te demonstreren hoe deze functie kan worden gebruikt om de locatie van een gebruiker op Google Maps weer te geven.

Dit product bevat GeoLite2-gegevens gemaakt door MaxMind, beschikbaar op //www.maxmind.com.

De code voor deze tutorial is te vinden op de Github-site.