Geolokasi berdasarkan IP di Jawa

1. Perkenalan

Pada artikel ini, kita akan membahas bagaimana mendapatkan data lokasi geografis dari alamat IP menggunakan MaxMind GeoIP2 Java API dengan database GeoLite2 gratis.

Kita juga akan melihat ini beraksi menggunakan aplikasi demo Web Spring MVC sederhana.

2. Memulai

Untuk memulai, Anda harus mengunduh GeoIP2 API dan database GeoLite2 dari MaxMind.

2.1. Ketergantungan Maven

Untuk menyertakan MaxMind GeoIP2 API di proyek Maven Anda, tambahkan berikut ini ke file pom.xml :

 com.maxmind.geoip2 geoip2 2.8.0 

Untuk mendapatkan API versi terbaru, Anda dapat menemukannya di Maven Central.

2.2. Mendownload Database

Selanjutnya, Anda harus mengunduh database GeoLite2. Untuk tutorial ini, kami menggunakan versi biner gzip dari database GeoLite2 City.

Setelah Anda membongkar arsip, Anda akan memiliki file bernama GeoLite2-City.mmdb . Ini adalah database pemetaan IP-ke-lokasi dalam format biner MaxMind berpemilik.

3. Menggunakan GeoIP2 Java API

Mari gunakan GeoIP2 Java API untuk mengambil data lokasi untuk alamat IP tertentu dari database. Pertama, mari buat DatabaseReader untuk membuat kueri database:

File database = new File(dbLocation); DatabaseReader dbReader = new DatabaseReader.Builder(database).build();

Selanjutnya, mari gunakan metode city ​​() untuk mendapatkan data kota untuk alamat IP:

CityResponse response = dbReader.city(ipAddress);

The CityResponse objek berisi beberapa informasi lain dari sekedar nama kota. Berikut adalah contoh pengujian JUnit yang menunjukkan cara membuka database, mengambil informasi kota untuk alamat IP, dan mengekstrak informasi ini dari CityResponse :

@Test public void givenIP_whenFetchingCity_thenReturnsCityData() throws IOException, GeoIp2Exception { String ip = "your-ip-address"; String dbLocation = "your-path-to-mmdb"; File database = new File(dbLocation); DatabaseReader dbReader = new DatabaseReader.Builder(database) .build(); InetAddress ipAddress = InetAddress.getByName(ip); CityResponse response = dbReader.city(ipAddress); String countryName = response.getCountry().getName(); String cityName = response.getCity().getName(); String postal = response.getPostal().getCode(); String state = response.getLeastSpecificSubdivision().getName(); }

4. Menggunakan GeoIP dalam Aplikasi Web

Mari kita lihat contoh aplikasi web yang mengambil data geolokasi dari alamat IP publik pengguna dan menampilkan lokasinya di peta.

Kita akan mulai dengan Aplikasi MVC Web Spring dasar. Kemudian kita akan menulis Pengontrol yang menerima alamat IP dalam permintaan POST dan mengembalikan respons JSON yang berisi kota, lintang, dan bujur yang disimpulkan dari GeoIP2 API.

Terakhir, kami akan menulis beberapa HTML dan JavaScript yang akan memuat alamat IP publik pengguna ke dalam formulir, mengirimkan permintaan Ajax POST ke Pengontrol kami , dan menampilkan hasilnya di Google Maps.

4.1. Kelas Entitas Respons

Mari kita mulai dengan mendefinisikan kelas yang akan menampung respons geolokasi:

public class GeoIP { private String ipAddress; private String city; private String latitude; private String longitude; // constructors, getters and setters... }

4.2. Kelas Layanan

Sekarang mari kita tulis kelas layanan yang mengambil data geolokasi menggunakan API Java GeoIP2 dan database GeoLite2:

public class RawDBDemoGeoIPLocationService { private DatabaseReader dbReader; public RawDBDemoGeoIPLocationService() throws IOException { File database = new File("your-mmdb-location"); dbReader = new DatabaseReader.Builder(database).build(); } public GeoIP getLocation(String ip) throws IOException, GeoIp2Exception { InetAddress ipAddress = InetAddress.getByName(ip); CityResponse response = dbReader.city(ipAddress); String cityName = response.getCity().getName(); String latitude = response.getLocation().getLatitude().toString(); String longitude = response.getLocation().getLongitude().toString(); return new GeoIP(ip, cityName, latitude, longitude); } }

4.3. Pengendali Musim Semi

Mari kita lihat Controller for Spring MVC yang mengirimkan parameter permintaan "ipAddress" ke kelas layanan kita untuk mendapatkan data respons geolokasi:

@RestController public class GeoIPTestController { private RawDBDemoGeoIPLocationService locationService; public GeoIPTestController() throws IOException { locationService = new RawDBDemoGeoIPLocationService(); } @PostMapping("/GeoIPTest") public GeoIP getLocation( @RequestParam(value="ipAddress", required=true) String ipAddress ) throws Exception { GeoIPLocationService locationService = new RawDBDemoGeoIPLocationService(); return locationService.getLocation(ipAddress); } }

4.4. Formulir HTML

Mari tambahkan kode front-end untuk memanggil Pengontrol Musim Semi kita , dimulai dengan formulir HTML yang berisi alamat IP:

     ... 

4.5. Memuat Alamat IP Publik di Klien

Sekarang mari mengisi kolom teks "ipAddress" dengan alamat IP publik pengguna, menggunakan jQuery dan ipify.org JavaScript API:

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

4.6. Mengirimkan Permintaan Ajax POST

When the form is submitted, we will make an Ajax POST request to the Spring Controller to retrieve the JSON Response with geolocation data:

$( "#ipForm" ).submit(function( event ) { event.preventDefault(); $.ajax({ url: "GeoIPTest", type: "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("Error:"+JSON.stringify(data)); }, }); });

4.7. Sample JSON Response

The JSON response from our Spring Controller will have the following format:

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

4.8. Displaying the Location on Google Maps

To display the location on Google Maps, you'll need to include the Google Maps API in your HTML code:

You can obtain an API Key for Google Maps using the Google Developer Console.

You'll also need to define an HTML tag to contain the map image:

You can use the following JavaScript function to display the coordinates on Google Maps:

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 +" @ "+location.city }); }

After starting the web application, open the URL for the map page:

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

You will see the current public IP address for your connection loaded into the text box:

Note that both GeoIP2 and ipify support IPv4 addresses as well as IPv6 addresses.

When you submit the form, you'll see the JSON response text, including the city, latitude, and longitude corresponding to your public IP Address, and below that, you'll see a Google Map pointing to your location:

5. Conclusion

In this tutorial, we reviewed the usage of the MaxMind GeoIP2 Java API and free MaxMind GeoLite2 City database using a JUnit test.

Then we built a Spring MVC Controller and service to obtain the geolocation data (city, latitude, longitude) from an IP address.

Finally, we built an HTML/JavaScript front end to demonstrate how this feature can be used to display a user's location on Google Maps.

This product includes GeoLite2 data created by MaxMind, available from //www.maxmind.com.

Kode untuk tutorial ini dapat ditemukan di situs Github.