Geolocation efter IP i Java

1. Introduktion

I denne artikel vil vi undersøge, hvordan man får geografiske placeringsdata fra en IP-adresse ved hjælp af MaxMind GeoIP2 Java API med den gratis GeoLite2-database.

Vi vil også se dette i aktion ved hjælp af en simpel Spring MVC Web-demo-applikation.

2. Kom godt i gang

For at komme i gang skal du downloade GeoIP2 API og GeoLite2-databasen fra MaxMind.

2.1. Maven afhængighed

Hvis du vil inkludere MaxMind GeoIP2 API i dit Maven-projekt, skal du føje følgende til pom.xml fil:

 com.maxmind.geoip2 geoip2 2.8.0 

For at få den nyeste version af API'en kan du finde den på Maven Central.

2.2. Download af databasen

Derefter skal du downloade GeoLite2-databasen. Til denne vejledning bruger vi den binære gzipped version af GeoLite2 City-databasen.

Når du har pakket ud arkivet, har du en fil med navnet GeoLite2-City.mmdb. Dette er en database med IP-til-placering-kortlægninger i det proprietære binære MaxMind-format.

3. Brug af GeoIP2 Java API

Lad os bruge GeoIP2 Java API til at hente placeringsdata for en given IP-adresse fra databasen. Lad os først oprette en DatabaseReader at spørge databasen:

Fildatabase = ny fil (dbLocation); DatabaseReader dbReader = ny DatabaseReader.Builder (database) .build ();

Lad os derefter bruge by () metode til at hente bydata til en IP-adresse:

CityResponse-svar = dbReader.city (ipAddress);

Det CityResponse objektet indeholder flere andre oplysninger end bare bynavnet. Her er en JUnit-prøve, der viser, hvordan man åbner databasen, henter byoplysninger til en IP-adresse og udtrækker disse oplysninger fra CityResponse:

@Test offentligt ugyldigt givetIP_whenFetchingCity_thenReturnsCityData () kaster IOException, GeoIp2Exception {String ip = "din-ip-adresse"; Streng dbLocation = "din-sti-til-mmdb"; Fildatabase = ny fil (dbLocation); DatabaseReader dbReader = ny DatabaseReader.Builder (database) .build (); InetAddress ipAddress = InetAddress.getByName (ip); CityResponse-svar = dbReader.city (ipAddress); String countryName = respons.getCountry (). GetName (); Streng cityName = respons.getCity (). GetName (); String postal = respons.getPostal (). GetCode (); Strengtilstand = respons.getLeastSpecificSubdivision (). GetName (); }

4. Brug af GeoIP i en webapplikation

Lad os se på et eksempel på en webapplikation, der henter geolokaliseringsdata fra en brugers offentlige IP-adresse og viser placeringen på et kort.

Vi starter med en grundlæggende Spring Web MVC-applikation. Så skriver vi en Controller der accepterer en IP-adresse i en POST-anmodning og returnerer et JSON-svar, der indeholder by, breddegrad og længdegrad trukket fra GeoIP2 API.

Endelig skriver vi HTML og JavaScript, der vil indlæse brugerens offentlige IP-adresse i formularen, indsende en Ajax POST-anmodning til vores Controller, og få vist resultatet i Google Maps.

4.1. Responsenhedsklassen

Lad os starte med at definere den klasse, der indeholder geolokaliseringssvaret:

offentlig klasse GeoIP {privat streng ipAddress; private String by; privat streng bredde; privat streng længdegrad; // konstruktører, getters og settere ...}

4.2. Serviceklassen

Lad os nu skrive serviceklassen, som henter geolokationsdata ved hjælp af GeoIP2 Java API og GeoLite2-databasen:

offentlig klasse RawDBDemoGeoIPLocationService {privat DatabaseReader dbReader; offentlig RawDBDemoGeoIPLocationService () kaster IOException {File database = new File ("your-mmdb-location"); dbReader = ny DatabaseReader.Builder (database) .build (); } offentlig GeoIP getLocation (streng ip) kaster IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName (ip); CityResponse-svar = dbReader.city (ipAddress); Streng cityName = respons.getCity (). GetName (); Strengbreddegrad = respons.getLocation (). GetLatitude (). Til String (); String længdegrad = respons.getLocation (). GetLongitude (). TilString (); returner ny GeoIP (ip, cityName, latitude, longitude); }}

4.3. Spring Controller

Lad os se på Controller til Spring MVC, som sender parameteren "ipAddress" -anmodning til vores serviceklasse for at få data om geolokaliseringssvar:

@RestController offentlig klasse GeoIPTestController {privat RawDBDemoGeoIPLocationService locationService; offentlig GeoIPTestController () kaster IOException {locationService = ny RawDBDemoGeoIPLocationService (); } @PostMapping ("/ GeoIPTest") offentlig GeoIP getLocation (@RequestParam (værdi = "ipAddress", krævet = sand) String ipAddress) kaster undtagelse {GeoIPLocationService locationService = ny RawDBDemoGeoIPLocationService (); returner locationService.getLocation (ipAddress); }}

4.4. HTML-formularen

Lad os tilføje frontend-koden for at kalde vores forår Controller, begynder med en HTML-formular, der indeholder IP-adressen:

     ... 

4.5. Indlæser den offentlige IP-adresse på klienten

Lad os nu udfylde tekstfeltet “ipAddress” med brugerens offentlige IP-adresse ved hjælp af jQuery og JavaScript API for ipify.org:

   $ (dokument). klar (funktion () {$ .get ("//api.ipify.org?format=json", funktion (data) {$ ("# ip"). val (data.ip);} ); ... 

4.6. Indsendelse af Ajax POST-anmodning

Når formularen er indsendt, sender vi en Ajax POST-anmodning til foråret Controller for at hente JSON-svaret med geolokaliseringsdata:

$ ("#ipForm") .submit (funktion (begivenhed) {event.preventDefault (); $ .ajax ({url: "GeoIPTest", type: "POST", contentType: "application / x-www-form-urlencoded) ; charset = UTF-8 ", data: $ .param ({ipAddress: $ (" # ip "). val ()}), komplet: funktion (data) {}, succes: funktion (data) {$ (" #status "). html (JSON.stringify (data)); hvis (data.ipAddress! = null) {showLocationOnMap (data);}}, fejl: funktion (err) {$ (" # status "). html ( "Fejl:" + JSON.stringify (data));},});});

4.7. Eksempel på JSON-svar

JSON-svaret fra vores forår Controller har følgende format:

{"ipAddress": "din-ip-adresse", "by": "din-by", "breddegrad": "din-breddegrad", "længdegrad": "din-længdegrad"}

4.8. Visning af placeringen på Google Maps

For at vise placeringen på Google Maps skal du medtage Google Maps API i din HTML-kode:

Du kan få en API-nøgle til Google Maps ved hjælp af Google Developer Console.

Du skal også definere en HTML tag for at indeholde kortbilledet:

Du kan bruge følgende JavaScript-funktion til at vise koordinaterne på Google Maps:

funktion showLocationOnMap (placering) {var kort; 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}); }

Efter start af webapplikationen skal du åbne URL'en til kortsiden:

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

Du vil se den aktuelle offentlige IP-adresse for din forbindelse indlæst i tekstboksen:

Bemærk, at både GeoIP2 og ipify understøtter IPv4-adresser såvel som IPv6-adresser.

Når du sender formularen, ser du JSON-svarteksten, inklusive by, breddegrad og længdegrad, der svarer til din offentlige IP-adresse, og under det kan du se et Google Map, der peger på din placering:

5. Konklusion

I denne vejledning gennemgik vi brugen af ​​MaxMind GeoIP2 Java API og gratis MaxMind GeoLite2 City-database ved hjælp af en JUnit-test.

Derefter byggede vi en Spring MVC Controller og service for at hente geolokaliseringsdata (by, bredde, længdegrad) fra en IP-adresse.

Endelig byggede vi en HTML / JavaScript-frontend til at demonstrere, hvordan denne funktion kan bruges til at vise en brugers placering på Google Maps.

Dette produkt inkluderer GeoLite2-data oprettet af MaxMind, tilgængelig fra //www.maxmind.com.

Koden til denne vejledning kan findes på Github-webstedet.


$config[zx-auto] not found$config[zx-overlay] not found