Geolociranje putem IP-a u Javi

1. Uvod

U ovom ćemo članku istražiti kako dobiti podatke o zemljopisnom položaju s IP adrese pomoću MaxMind GeoIP2 Java API-ja s besplatnom bazom podataka GeoLite2.

To ćemo vidjeti i na djelu pomoću jednostavne proljetne MVC web demo aplikacije.

2. Početak rada

Da biste započeli, morat ćete preuzeti GeoIP2 API i GeoLite2 bazu podataka s MaxMind-a.

2.1. Ovisnost Mavena

Da biste u svoj Maven projekt uključili MaxMind GeoIP2 API, dodajte sljedeće u pom.xml datoteka:

 com.maxmind.geoip2 geoip2 2.8.0 

Da biste dobili najnoviju verziju API-ja, možete je pronaći na Maven Central.

2.2. Preuzimanje baze podataka

Dalje, morat ćete preuzeti bazu podataka GeoLite2. Za ovaj tutorial koristimo binarnu gzipiranu verziju baze podataka GeoLite2 City.

Nakon što raspakirate arhivu, imat ćete datoteku s imenom GeoLite2-City.mmdb. Ovo je baza podataka preslikavanja IP-a u lokaciju u vlasničkom binarnom formatu MaxMind.

3. Korištenje GeoIP2 Java API-ja

Upotrijebimo GeoIP2 Java API za dohvaćanje podataka o lokaciji za datu IP adresu iz baze podataka. Prvo, izradimo a DatabaseReader za upit prema bazi podataka:

Baza podataka datoteke = nova datoteka (dbLocation); DatabaseReader dbReader = novi DatabaseReader.Builder (baza podataka) .build ();

Dalje, upotrijebimo Grad() metoda za dobivanje podataka o gradu za IP adresu:

Odgovor CityResponse = dbReader.city (ipAddress);

The CityResponse objekt sadrži nekoliko podataka koji nisu samo ime grada. Evo primjera JUnit testa koji pokazuje kako otvoriti bazu podataka, dohvatiti podatke o gradu za IP adresu i izvući te podatke iz CityResponse:

@Test public void givenIP_whenFetchingCity_thenReturnsCityData () baca IOException, GeoIp2Exception {String ip = "your-ip-address"; Niz dbLocation = "vaš-put-do-mmdb"; Baza podataka datoteke = nova datoteka (dbLocation); DatabaseReader dbReader = novi DatabaseReader.Builder (baza podataka) .build (); InetAddress ipAddress = InetAddress.getByName (ip); Odgovor CityResponse = dbReader.city (ipAddress); Niz countryName = response.getCountry (). GetName (); Niz gradaName = response.getCity (). GetName (); String postal = response.getPostal (). GetCode (); Stanje niza = response.getLeastSpecificSubdivision (). GetName (); }

4. Korištenje GeoIP-a u web aplikaciji

Pogledajmo primjer web aplikacije koja dohvaća podatke o geolokaciji s javne IP adrese korisnika i prikazuje lokaciju na karti.

Započet ćemo s osnovnom Spring MVC aplikacijom. Tada ćemo napisati a Kontroler koja prihvaća IP adresu u POST zahtjevu i vraća JSON odgovor koji sadrži grad, širinu i dužinu izvedene iz GeoIP2 API-ja.

Na kraju, napisat ćemo HTML i JavaScript koji će učitati javnu IP adresu korisnika u obrazac, predati Ajax POST zahtjev našem Kontroleri prikažite rezultat na Google kartama.

4.1. Klasa entiteta odgovora

Počnimo s definiranjem klase koja će sadržavati odgovor geolokacije:

javna klasa GeoIP {private String ipAddress; privatni gudački grad; privatna Širina niza; privatna dužina niza; // konstruktori, getteri i postavljači ...}

4.2. Servisna klasa

Sada napišite klasu usluge koja dohvaća podatke o geolokaciji pomoću GeoIP2 Java API-ja i GeoLite2 baze podataka:

javna klasa RawDBDemoGeoIPLocationService {private DatabaseReader dbReader; public RawDBDemoGeoIPLocationService () baca IOException {Baza podataka datoteke = nova datoteka ("your-mmdb-location"); dbReader = novi DatabaseReader.Builder (baza podataka) .build (); } javni GeoIP getLocation (String ip) baca IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName (ip); Odgovor CityResponse = dbReader.city (ipAddress); Niz gradaName = response.getCity (). GetName (); Širina niza = response.getLocation (). GetLatitude (). ToString (); Longitude niza = response.getLocation (). GetLongitude (). ToString (); vrati novi GeoIP (ip, cityName, geografska širina, dužina); }}

4.3. Proljetni kontroler

Pogledajmo Kontroler za Spring MVC koji šalje parametar zahtjeva „ipAddress“ našoj klasi usluga da bi dobio podatke o odgovoru na geolokaciju:

@RestController javna klasa GeoIPTestController {private RawDBDemoGeoIPLocationService locationService; javni GeoIPTestController () baca IOException {locationService = new RawDBDemoGeoIPLocationService (); } @PostMapping ("/ GeoIPTest") javni GeoIP getLocation (@RequestParam (value = "ipAddress", required = true) String ipAddress) baca izuzetak {GeoIPLocationService locationService = new RawDBDemoGeoIPLocationService (); vratiti locationService.getLocation (ipAddress); }}

4.4. HTML obrazac

Dodajmo prednji kôd da pozovemo naše proljeće Kontroler, počevši od HTML obrasca koji sadrži IP adresu:

     ... 

4.5. Učitavanje javne IP adrese na klijenta

Sada unaprijed popunimo tekstualno polje „ipAddress“ korisnikovom javnom IP adresom, koristeći jQuery i JavaScript API ipify.org:

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

4.6. Podnošenje zahtjeva za Ajax POST

Kada se obrazac pošalje, podnijet ćemo Ajax POST zahtjev Springu Kontroler za dohvaćanje JSON odgovora s podacima o geolokaciji:

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

4.7. Uzorak JSON odgovora

JSON-ov odgovor s našeg proljeća Kontroler imat će sljedeći format:

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

4.8. Prikazivanje lokacije na Google kartama

Da biste prikazali lokaciju na Google kartama, morat ćete u svoj HTML kôd uključiti API za Google Maps:

API ključ za Google karte možete dobiti pomoću Google Developer Console.

Također ćete trebati definirati HTML oznaka koja sadrži sliku karte:

Za prikaz koordinata na Google kartama možete koristiti sljedeću JavaScript funkciju:

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

Nakon pokretanja web aplikacije otvorite URL stranice karte:

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

Vidjet ćete trenutnu javnu IP adresu vaše veze učitane u okvir za tekst:

Imajte na umu da i GeoIP2 i ipify podržavaju IPv4 adrese kao i IPv6 adrese.

Kada pošaljete obrazac, vidjet ćete tekst odgovora JSON, uključujući grad, zemljopisnu širinu i dužinu koji odgovaraju vašoj javnoj IP adresi, a ispod toga vidjet ćete Google Map koji pokazuje na vašu lokaciju:

5. Zaključak

U ovom smo uputstvu pregledali upotrebu MaxMind GeoIP2 Java API-ja i besplatne baze podataka MaxMind GeoLite2 City pomoću JUnit testa.

Tada smo izgradili Spring MVC Kontroler i usluga za dobivanje podataka o geolokaciji (grad, zemljopisna širina, dužina) s IP adrese.

Konačno, napravili smo HTML / JavaScript prednji kraj kako bismo demonstrirali kako se ova značajka može koristiti za prikaz korisničkog mjesta na Google kartama.

Ovaj proizvod uključuje GeoLite2 podatke koje je stvorio MaxMind, dostupne na //www.maxmind.com.

Kôd ovog vodiča možete pronaći na web mjestu Github.