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.