Földrajzi helymeghatározás IP-ben Java-ban
1. Bemutatkozás
Ebben a cikkben azt vizsgáljuk, hogyan lehet földrajzi helyadatokat szerezni egy IP-címről a MaxMind GeoIP2 Java API segítségével az ingyenes GeoLite2 adatbázissal.
Ezt egy egyszerű Spring MVC Web demo alkalmazás segítségével is meg fogjuk tapasztalni.
2. Az első lépések
A kezdéshez le kell töltenie a GeoIP2 API és a GeoLite2 adatbázist a MaxMind webhelyről.
2.1. Maven-függőség
Ha hozzá szeretné adni a MaxMind GeoIP2 API-t a Maven projektjéhez, vegye fel a következőket a pom.xml fájl:
com.maxmind.geoip2 geoip2 2.8.0
Az API legújabb verziójának megszerzéséhez megtalálhatja a Maven Central oldalon.
2.2. Az adatbázis letöltése
Ezután le kell töltenie a GeoLite2 adatbázist. Ehhez az oktatóanyaghoz a GeoLite2 City adatbázis bináris gzip verzióját használjuk.
Miután kibontotta az archívumot, megkap egy fájlt GeoLite2-City.mmdb. Ez az IP-hely leképezések adatbázisa a saját MaxMind bináris formátumban.
3. A GeoIP2 Java API használata
Használjuk a GeoIP2 Java API-t egy adott IP-cím helyadatainak lekéréséhez az adatbázisból. Először hozzunk létre egy DatabaseReader az adatbázis lekérdezéséhez:
Fájl adatbázis = új Fájl (dbLocation); DatabaseReader dbReader = új DatabaseReader.Builder (adatbázis) .build ();
Ezután használjuk a város() módszer a városi adatok megszerzésére egy IP-címhez:
CityResponse response = dbReader.city (ipAddress);
A CityResponse Az objektum a város nevén kívül számos információt tartalmaz. Itt van egy minta JUnit teszt, amely bemutatja, hogyan lehet megnyitni az adatbázist, beolvasni az IP-címre vonatkozó városi információkat, és kivonni ezeket az információkat a CityResponse:
@Test public void givenIP_whenFetchingCity_thenReturnsCityData () dobja az IOException, a GeoIp2Exception {String ip = "az ön-ip-cím"; Karakterlánc dbLocation = "utad-mmdb-ig"; Fájl adatbázis = új Fájl (dbLocation); DatabaseReader dbReader = új DatabaseReader.Builder (adatbázis) .build (); InetAddress ipAddress = InetAddress.getByName (ip); CityResponse response = dbReader.city (ipAddress); Karakterlánc országNév = response.getCountry (). GetName (); Karakterlánc városnév = response.getCity (). GetName (); String postal = response.getPostal (). GetCode (); Karaktersorozat = response.getLeastSpecificSubdivision (). GetName (); }
4. A GeoIP használata egy webalkalmazásban
Nézzünk meg egy példa webalkalmazást, amely lekérdezi a helymeghatározási adatokat a felhasználó nyilvános IP-címéről, és megjeleníti a helyet a térképen.
Kezdjük egy alap Tavaszi Web MVC alkalmazással. Akkor írunk egy Vezérlő amely elfogad egy IP-címet egy POST-kérésben, és visszaküldi a GeoIP2 API-ból levezetett várost, szélességet és hosszúságot tartalmazó JSON-választ.
Végül írunk néhány HTML-t és JavaScript-et, amely betölti a felhasználó nyilvános IP-címét az űrlapba, és elküldünk egy Ajax POST kérést a Vezérlő, és jelenítse meg az eredményt a Google Térképen.
4.1. A Válasz Entity osztály
Kezdjük azzal, hogy meghatározzuk azt az osztályt, amely megtartja a geolokációs választ:
nyilvános osztály GeoIP {private String ipAddress; privát String város; privát String szélesség; privát húr hosszúság; // kivitelezők, szerelők és szerelők ...}
4.2. A szolgáltatási osztály
Most írjuk meg azt a szolgáltatási osztályt, amely a GeoIP2 Java API és a GeoLite2 adatbázis segítségével lekéri a geolokációs adatokat:
public class RawDBDemoGeoIPLocationService {private DatabaseReader dbReader; public RawDBDemoGeoIPLocationService () dobja az IOException {File database = new File ("your-mmdb-location"); dbReader = új DatabaseReader.Builder (adatbázis) .build (); } public GeoIP getLocation (String ip) dobja az IOException, a GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName (ip); CityResponse response = dbReader.city (ipAddress); Karakterlánc városnév = response.getCity (). GetName (); Karakterlánc szélessége = válasz.getLocation (). GetLatitude (). ToString (); Karakterlánc hosszúság = response.getLocation (). GetLongitude (). ToString (); adja vissza az új GeoIP-t (ip, városNév, szélesség, hosszúság); }}
4.3. A rugós vezérlő
Vessünk egy pillantást a Vezérlő Spring MVC esetében, amely elküldi az „ipAddress” kérési paramétert a szolgáltatási osztályunknak a geolokációs válaszadatok megszerzéséhez:
@RestController nyilvános osztály GeoIPTestController {private RawDBDemoGeoIPLocationService locationService; public GeoIPTestController () dobja az IOException {locationService = new RawDBDemoGeoIPLocationService (); } @ PostMapping ("/ GeoIPTest") public GeoIP getLocation (@RequestParam (value = "ipAddress", required = true) String ipAddress) dobja a Kivételt {GeoIPLocationService locationService = new RawDBDemoGeoIPLocationService (); return locationService.getLocation (ipAddress); }}
4.4. A HTML-űrlap
Adjuk hozzá a kezelői kódot, hogy felhívjuk a tavaszunkat Vezérlő, az IP-címet tartalmazó HTML-űrlappal kezdődik:
...
4.5. A nyilvános IP-cím betöltése az ügyfélre
Töltsük fel előre az „ipAddress” szövegmezőt a felhasználó nyilvános IP-címével, a jQuery és az ipify.org JavaScript API használatával:
$ (document) .ready (function () {$ .get ("//api.ipify.org?format=json", function (data) {$ ("# ip"). val (data.ip);} ); ...
4.6. Az Ajax POST kérés benyújtása
Az űrlap elküldésével Ajax POST kérést fogunk benyújtani a tavaszhoz Vezérlő a JSON válasz geolokációs adatokkal történő lekéréséhez:
$ ("#ipForm") .submit (function (event) {event.preventDefault (); $ .ajax ({url: "GeoIPTest", típus: "POST", contentType: "application / x-www-form-urlencoded" ; charset = UTF-8 ", adatok: $ .param ({ipAddress: $ (" # ip "). val ()}), teljes: function (adatok) {}, siker: function (adatok) {$ (" #status "). html (JSON.stringify (data)); if (data.ipAddress! = null) {showLocationOnMap (data);}}, hiba: function (err) {$ (" # status "). html ( "Hiba:" + JSON.stringify (adatok));},});});
4.7. Minta JSON válasz
Tavaszunk JSON válasza Vezérlő a következő formátumú lesz:
{"ipAddress": "your-ip-address", "city": "your-city", "platitude": "your-platitude", "longitude": "your-longitude"}
4.8. A hely megjelenítése a Google Térképen
A hely megjelenítéséhez a Google Térképen be kell építenie a Google Maps API-t a HTML-kódjába:
API-kulcsot kaphat a Google Maps számára a Google Developer Console segítségével.
Meg kell határoznia egy HTML-t is a térképképet tartalmazó címke:
A következő JavaScript funkcióval megjelenítheti a koordinátákat a Google Maps-en:
function showLocationOnMap (hely) {var map; map = new google.maps.Map (document.getElementById ('map'), {center: {lat: Szám (hely.hosszúság), lng: Szám (hely.hosszúság)}, zoom: 15}); var marker = new google.maps.Marker ({pozíció: {lat: Szám (hely.latitude), lng: Szám (hely.hosszúság)}, térkép: térkép, cím: "Nyilvános IP:" + hely.ipAddress + " @ "+ hely.város}); }
A webalkalmazás indítása után nyissa meg a térképoldal URL-jét:
//localhost:8080/spring-mvc-xml/GeoIpTest.jsp
Látni fogja a kapcsolat aktuális nyilvános IP-címét a szövegmezőbe töltve:
Vegye figyelembe, hogy a GeoIP2 és az ipify egyaránt támogatja az IPv4 és az IPv6 címeket.
Az űrlap elküldésével látni fogja a JSON válaszszövegét, amely tartalmazza a nyilvános IP-címének megfelelő várost, szélességet és hosszúságot, és alatta egy Google Térkép jelenik meg, amely a helyére mutat:
5. Következtetés
Ebben az oktatóanyagban áttekintettük a MaxMind GeoIP2 Java API és az ingyenes MaxMind GeoLite2 City adatbázis használatát JUnit teszt segítségével.
Aztán felépítettünk egy Spring MVC-t Vezérlő és szolgáltatás a földrajzi helyadatok (város, szélesség, hosszúság) IP-címről történő megszerzésére.
Végül HTML / JavaScript kezelőfelületet készítettünk annak bemutatására, hogy ez a funkció hogyan használható a felhasználó tartózkodási helyének megjelenítésére a Google Térképen.
Ez a termék a MaxMind által létrehozott GeoLite2 adatokat tartalmazza, amelyek a //www.maxmind.com webhelyről érhetők el.
Az oktatóanyag kódja a Github webhelyén található.