מיקום גיאוגרפי לפי IP בג'אווה

1. הקדמה

במאמר זה נחקור כיצד לקבל נתוני מיקום גיאוגרפי מכתובת IP באמצעות MaxMind GeoIP2 Java API עם מסד הנתונים החינמי GeoLite2.

אנו נראה זאת גם בפעולה באמצעות יישום פשוט של Spring MVC Web.

2. תחילת העבודה

כדי להתחיל, יהיה עליך להוריד את ה- GeoIP2 API ואת מסד הנתונים GeoLite2 מ- MaxMind.

2.1. תלות של Maven

כדי לכלול את MaxMind GeoIP2 API בפרויקט Maven שלך, הוסף את הפרטים הבאים ל- pom.xml קוֹבֶץ:

 com.maxmind.geoip2 geoip2 2.8.0 

כדי לקבל את הגרסה האחרונה של ה- API, תוכל למצוא אותה ב- Maven Central.

2.2. הורדת מסד הנתונים

לאחר מכן, יהיה עליך להוריד את מסד הנתונים GeoLite2. לצורך הדרכה זו אנו משתמשים בגרסת ה- gzipped הבינארית של מסד הנתונים GeoLite2 City.

לאחר פריקת הארכיון, יהיה לך קובץ בשם GeoLite2-City.mmdb. זהו מאגר מידע של מיפוי IP למיקום בפורמט הבינארי MaxMind הקנייני.

3. שימוש ב- GeoIP2 Java API

בואו נשתמש בממשק ה- API של GeoIP2 כדי להביא נתוני מיקום עבור כתובת IP נתונה ממסד הנתונים. ראשית, בואו ניצור a DatabaseReader לשאילתת מסד הנתונים:

מאגר קבצים = קובץ חדש (dbLocation); DatabaseReader dbReader = DatabaseReader.Builder חדש (מסד נתונים) .build ();

לאחר מכן, בואו נשתמש ב- עִיר() שיטה להשגת נתוני העיר לכתובת IP:

תגובת CityResponse = dbReader.city (ipAddress);

ה CityResponse האובייקט מכיל כמה פיסות מידע מלבד רק שם העיר. הנה מבחן JUnit לדוגמא המראה כיצד לפתוח את מסד הנתונים, להביא את המידע העירוני עבור כתובת IP ולחלץ מידע זה מה CityResponse:

@ מבט בטל ציבורי שניתןIP_whenFetchingCity_thenReturnsCityData () זורק IOException, GeoIp2Exception {String ip = "your-ip-address"; מחרוזת dbLocation = "your-path-to-mmdb"; מאגר קבצים = קובץ חדש (dbLocation); DatabaseReader dbReader = DatabaseReader.Builder חדש (מסד נתונים) .build (); InetAddress ipAddress = InetAddress.getByName (ip); תגובת CityResponse = dbReader.city (ipAddress); מחרוזת countryName = response.getCountry (). GetName (); מחרוזת cityName = response.getCity (). GetName (); מחרוזת דואר = respons.getPostal (). GetCode (); מצב מחרוזת = respons.getLeastSpecificSubdivision (). GetName (); }

4. שימוש ב- GeoIP ביישום אינטרנט

בואו נסתכל על יישום אינטרנט לדוגמא שמביא נתוני מיקום גיאוגרפי מכתובת ה- IP הציבורית של המשתמש ומציג את המיקום במפה.

נתחיל ביישום בסיסי MVC של Spring Web. ואז נכתוב א בקר שמקבל כתובת IP בבקשת POST ומחזיר תגובת JSON המכילה עיר, קו רוחב ואורך הנגזרים מממשק ה- API של GeoIP2.

לבסוף, נכתוב קצת HTML ו- JavaScript שיעמיסו את כתובת ה- IP הציבורית של המשתמש לטופס, ונגיש בקשת Ajax POST אל שלנו בקר, ולהציג את התוצאה במפות Google.

4.1. מחלקת יישות התגובה

נתחיל בהגדרת המחלקה שתחזיק את תגובת המיקום הגיאוגרפי:

מחלקה ציבורית GeoIP {ipAddress מחרוזת פרטית; עיר מיתרים פרטית; קו רוחב פרטי מחרוזת; אורך מחרוזת פרטי; // בונים, גטרים וקובעים ...}

4.2. מחלקת השירות

עכשיו בואו נכתוב את מחלקת השירות שמביאה את נתוני המיקום הגיאוגרפי באמצעות GeoIP2 Java API ו- GeoLite2:

מחלקה ציבורית RawDBDemoGeoIPLocationService {פרטי DatabaseReader dbReader; ציבורי RawDBDemoGeoIPLocationService () זורק את IOException {database database = new file ("your-mmdb-location"); dbReader = DatabaseReader.Builder חדש (מסד נתונים) .build (); } getLocation ציבורי של GeoIP (מחרוזת ip) זורק IOException, GeoIp2Exception {InetAddress ipAddress = InetAddress.getByName (ip); תגובת CityResponse = dbReader.city (ipAddress); מחרוזת cityName = response.getCity (). GetName (); קו רוחב מחרוזת = respons.getLocation (). GetLatitude (). ToString (); אורך מחרוזת = response.getLocation (). GetLongitude (). ToString (); להחזיר GeoIP חדש (ip, cityName, קו רוחב, קו אורך); }}

4.3. בקר האביב

בואו נסתכל על ה- בקר עבור Spring MVC ששולח את פרמטר הבקשה "ipAddress" למחלקת השירות שלנו כדי לקבל את נתוני התגובה למיקום גיאוגרפי:

@RestController מחלקה ציבורית GeoIPTestController {פרטי RawDBDemoGeoIPLocationService locationService; GeoIPTestController ציבורי () זורק IOException {locationService = RawDBDemoGeoIPLocationService חדש (); } @PostMapping ("/ GeoIPTest") getLocation ציבורי של GeoIP (@RequestParam (value = "ipAddress", חובה = true) מחרוזת ipAddress) זורק חריג {GeoIPLocationService locationService = חדש RawDBDemoGeoIPLocationService (); להחזיר locationService.getLocation (ipAddress); }}

4.4. טופס ה- HTML

בואו נוסיף את קוד החזית כדי לקרוא לאביב שלנו בקר, החל בטופס HTML המכיל את כתובת ה- IP:

     ... 

4.5. טוען את כתובת ה- IP הציבורית על הלקוח

כעת בואו לאכלס מראש את שדה הטקסט "ipAddress" בכתובת ה- IP הציבורית של המשתמש, באמצעות jQuery ו- API של JavaScript של ipify.org:

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

4.6. הגשת בקשת POST של Ajax

עם הגשת הטופס, אנו נגיש בקשה ל- Ajax POST למעיין בקר כדי לאחזר את תגובת JSON עם נתוני מיקום גיאוגרפי:

$ ("#ipForm"). שלח (פונקציה (אירוע) {event.preventDefault (); $ .ajax ({url: "GeoIPTest", סוג: "POST", contentType: "application / x-www-form-urlencoded) ; charset = UTF-8 ", נתונים: $ .param ({ipAddress: $ (" # ip "). val ()}), השלמה: פונקציה (נתונים) {}, הצלחה: פונקציה (נתונים) {$ (" #status "). html (JSON.stringify (data)); if (data.ipAddress! = null) {showLocationOnMap (data);}}, error: function (err) {$ (" # status "). html ( "שגיאה:" + JSON.stringify (נתונים));},});});

4.7. תגובת JSON לדוגמא

תגובת JSON מהאביב שלנו בקר יהיה בפורמט הבא:

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

4.8. הצגת המיקום במפות Google

כדי להציג את המיקום במפות Google, יהיה עליך לכלול את ה- API של מפות Google בקוד ה- HTML שלך:

תוכל להשיג מפתח API למפות Google באמצעות מסוף המפתחים של Google.

יהיה עליך גם להגדיר HTML תג להכיל את תמונת המפה:

אתה יכול להשתמש בפונקציית JavaScript הבאה כדי להציג את הקואורדינטות במפות Google:

פונקציה showLocationOnMap (מיקום) {var map; map = google.maps.Map חדש (document.getElementById ('מפה'), {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)}, מפה: מפה, כותרת: "IP ציבורי:" + location.ipAddress + " @ "+ location.city}); }

לאחר הפעלת יישום האינטרנט, פתח את כתובת האתר של דף המפה:

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

תראה את כתובת ה- IP הציבורית הנוכחית עבור החיבור שלך נטענת בתיבת הטקסט:

שים לב שגם GeoIP2 וגם ipify תומכים בכתובות IPv4 כמו גם בכתובות IPv6.

כשתשלח את הטופס, תראה את טקסט התגובה של JSON, כולל העיר, קו הרוחב והאורך המתאימים לכתובת ה- IP הציבורית שלך, ומתחתיה תראה מפה של Google המצביעה על המיקום שלך:

5. מסקנה

במדריך זה סקרנו את השימוש ב- MaxMind GeoIP2 Java API ובסיסי MaxMind GeoLite2 City בחינם באמצעות מבחן JUnit.

ואז בנינו MVC אביב בקר ושירות להשגת נתוני המיקום הגיאוגרפי (עיר, קו רוחב, קו אורך) מכתובת IP.

לבסוף בנינו ממשק קצה של HTML / JavaScript כדי להדגים כיצד ניתן להשתמש בתכונה זו להצגת מיקום המשתמש במפות Google.

מוצר זה כולל נתוני GeoLite2 שנוצרו על ידי MaxMind, הזמינים באתר //www.maxmind.com.

את הקוד להדרכה זו תוכלו למצוא באתר Github.


$config[zx-auto] not found$config[zx-overlay] not found