Geolokácia pomocou IP v Jave

1. Úvod

V tomto článku preskúmame, ako získať údaje o geografickej polohe z adresy IP pomocou MaxMind GeoIP2 Java API s bezplatnou databázou GeoLite2.

Toto uvidíme aj v akcii pomocou jednoduchej webovej ukážkovej aplikácie Spring MVC.

2. Začíname

Na začiatok je potrebné stiahnuť si aplikáciu GeoIP2 API a databázu GeoLite2 z MaxMind.

2.1. Maven závislosť

Ak chcete zahrnúť MaxMind GeoIP2 API do vášho projektu Maven, pridajte do pom.xml spis:

 com.maxmind.geoip2 geoip2 2.8.0 

Ak chcete získať najnovšiu verziu API, nájdete ju v Maven Central.

2.2. Sťahovanie databázy

Ďalej si budete musieť stiahnuť databázu GeoLite2. Pre tento tutoriál používame binárnu verziu databázy GeoLite2 City s gzipom.

Po rozbalení archívu budete mať súbor s názvom GeoLite2-City.mmdb. Toto je databáza mapovaní IP na umiestnenie v proprietárnom binárnom formáte MaxMind.

3. Používanie Java API GeoIP2

Na načítanie údajov o polohe pre danú adresu IP z databázy použijeme GeoIP2 Java API. Najskôr vytvorme a DatabaseReader vyhľadať v databáze:

Databáza súborov = nový súbor (dbLocation); DatabaseReader dbReader = nový DatabaseReader.Builder (databáza) .build ();

Ďalej použijeme mesto () spôsob získania mestských údajov pre IP adresu:

CityResponse response = dbReader.city (ipAddress);

The CityResponse objekt obsahuje niekoľko ďalších informácií okrem názvu mesta. Tu je ukážka testu JUnit, ktorý ukazuje, ako otvoriť databázu, načítať informácie o meste pre adresu IP a extrahovať tieto informácie z CityResponse:

@Test public void givenIP_whenFetchingCity_thenReturnsCityData () vyvolá IOException, GeoIp2Exception {String ip = "your-ip-address"; Reťazec dbLocation = "vaša-cesta-k-mmdb"; Databáza súborov = nový súbor (dbLocation); DatabaseReader dbReader = nový DatabaseReader.Builder (databáza) .build (); InetAddress ipAddress = InetAddress.getByName (ip); CityResponse response = dbReader.city (ipAddress); Reťazec countryName = response.getCountry (). GetName (); Reťazec cityName = response.getCity (). GetName (); Reťazec postal = response.getPostal (). GetCode (); Stav reťazca = response.getLeastSpecificSubdivision (). GetName (); }

4. Používanie GeoIP vo webovej aplikácii

Pozrime sa na ukážkovú webovú aplikáciu, ktorá načítava geolokačné údaje z verejnej adresy IP používateľa a zobrazuje polohu na mape.

Začneme základnou aplikáciou Spring Web MVC. Potom napíšeme a Kontrolór , ktorý v požiadavke POST prijme adresu IP a vráti odpoveď JSON obsahujúcu mesto, zemepisnú šírku a dĺžku odvodenú z API GeoIP2.

Na záver napíšeme nejaké HTML a JavaScript, ktoré načítajú verejnú IP adresu používateľa do formulára, odošleme požiadavku Ajax POST na našu Kontrolóra výsledok zobraziť v Mapách Google.

4.1. Trieda entity odpovede

Začnime definovaním triedy, ktorá bude obsahovať geolokačnú odpoveď:

public class GeoIP {private String ipAddress; súkromné ​​mesto String; súkromná zemepisná šírka reťazca; súkromná dĺžka reťazca; // konštruktory, zakladatelia a zakladatelia ...}

4.2. Trieda služby

Teraz napíšeme triedu služby, ktorá načítava geolokačné údaje pomocou rozhrania GeoIP2 Java API a databázy GeoLite2:

verejná trieda RawDBDemoGeoIPLocationService {súkromný DatabaseReader dbReader; public RawDBDemoGeoIPLocationService () hodí IOException {File database = new File ("your-mmdb-location"); dbReader = nový DatabaseReader.Builder (databáza) .build (); } public GeoIP getLocation (String ip) hodí IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName (ip); CityResponse response = dbReader.city (ipAddress); Reťazec cityName = response.getCity (). GetName (); Reťazec latitude = response.getLocation (). GetLatitude (). ToString (); Dĺžka reťazca = response.getLocation (). GetLongitude (). ToString (); vrátiť nový GeoIP (ip, cityName, zemepisná šírka, dĺžka); }}

4.3. Pružinový ovládač

Poďme sa pozrieť na Kontrolór pre Spring MVC, ktorá pošle parameter požiadavky „ipAddress“ do našej triedy služieb, aby získala údaje o odpovedi na geolokáciu:

@RestController verejná trieda GeoIPTestController {private RawDBDemoGeoIPLocationService locationService; public GeoIPTestController () hodí IOException {locationService = new RawDBDemoGeoIPLocationService (); } @PostMapping ("/ GeoIPTest") verejné GeoIP getLocation (@RequestParam (value = "ipAddress", required = true) reťazec ipAddress) vyvolá výnimku {GeoIPLocationService locationService = nový RawDBDemoGeoIPLocationService (); návrat locationService.getLocation (ipAddress); }}

4.4. Formulár HTML

Pridajme front-endový kód, aby sme mohli volať našu jar Kontrolór, začínajúce formulárom HTML obsahujúcim adresu IP:

     ... 

4.5. Načítanie verejnej IP adresy na klientovi

Poďme si vopred vyplniť textové pole „ipAddress“ verejnou IP adresou používateľa pomocou jQuery a API API ipify.org:

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

4.6. Odoslanie žiadosti Ajax POST

Po odoslaní formulára urobíme žiadosť Ajax POST na jar Kontrolór na získanie odpovede JSON s geolokačnými údajmi:

$ ("#ipForm") .submit (function (event) {event.preventDefault (); $ .ajax ({url: "GeoIPTest", typ: "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 ( "Chyba:" + JSON.stringify (data));},});});

4.7. Ukážka odpovede JSON

Odpoveď JSON z našej jari Kontrolór bude mať nasledujúci formát:

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

4.8. Zobrazenie polohy v Mapách Google

Ak chcete zobraziť polohu v Mapách Google, musíte do svojho kódu HTML zahrnúť rozhranie Google Maps API:

Kľúč API pre Mapy Google môžete získať pomocou Konzoly pre vývojárov Google.

Budete tiež musieť definovať kód HTML značka obsahujúca obraz mapy:

Na zobrazenie súradníc v Mapách Google môžete použiť nasledujúcu funkciu JavaScript:

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 + " @ "+ poloha.mesto}); }

Po spustení webovej aplikácie otvorte adresu URL stránky s mapou:

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

Aktuálna verejná adresa IP vášho pripojenia sa zobrazí načítaná do textového poľa:

Pamätajte, že GeoIP2 aj ipify podporujú adresy IPv4 aj IPv6.

Po odoslaní formulára sa zobrazí text odpovede JSON vrátane mesta, zemepisnej šírky a dĺžky zodpovedajúci vašej verejnej adrese IP a pod ním mapa Google, ktorá ukazuje na vaše umiestnenie:

5. Záver

V tomto tutoriáli sme skontrolovali použitie Java API MaxMind GeoIP2 a bezplatnú databázu MaxMind GeoLite2 City pomocou testu JUnit.

Potom sme postavili Spring MVC Kontrolór a služba na získanie geolokačných údajov (mesto, zemepisná šírka a dĺžka) z IP adresy.

Nakoniec sme vytvorili front-end HTML / JavaScript, aby sme demonštrovali, ako je možné túto funkciu použiť na zobrazenie polohy používateľa v Mapách Google.

Tento produkt obsahuje údaje GeoLite2 vytvorené spoločnosťou MaxMind, dostupné na //www.maxmind.com.

Kód tohto tutoriálu nájdete na webe Github.