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ó.