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.