Geolokasi oleh IP di Jawa

1. Pengenalan

Dalam artikel ini, kita akan meneroka cara mendapatkan data lokasi geografis dari alamat IP menggunakan MaxMind GeoIP2 Java API dengan pangkalan data GeoLite2 percuma.

Kami juga akan melihatnya dalam tindakan menggunakan aplikasi demo Web Spring MVC yang sederhana.

2. Bermula

Untuk memulakan, anda perlu memuat turun pangkalan data GeoIP2 API dan GeoLite2 dari MaxMind.

2.1. Ketergantungan Maven

Untuk menyertakan MaxMind GeoIP2 API dalam projek Maven anda, tambahkan yang berikut ke fail pom.xml :

 com.maxmind.geoip2 geoip2 2.8.0 

Untuk mendapatkan versi terbaru API, anda boleh mencarinya di Maven Central.

2.2. Memuat turun Pangkalan Data

Seterusnya, anda perlu memuat turun pangkalan data GeoLite2. Untuk tutorial ini, kami menggunakan versi pangkalan data GeoLite2 City versi gzip.

Selepas membongkar arkib, anda akan mempunyai fail bernama GeoLite2-City.mmdb . Ini adalah pangkalan data pemetaan IP ke lokasi dalam format binari MaxMind proprietari.

3. Menggunakan API GeoIP2 Java

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

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

Seterusnya, mari kita gunakan kaedah bandar () untuk mendapatkan data bandar untuk alamat IP:

CityResponse response = dbReader.city(ipAddress);

The CityResponse objek mengandungi beberapa maklumat selain hanya nama bandar. Berikut adalah contoh ujian JUnit yang menunjukkan cara membuka pangkalan data, mengambil maklumat bandar untuk alamat IP, dan mengekstrak maklumat 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 awam pengguna dan memaparkan lokasi di peta.

Kami akan memulakan dengan Aplikasi Web MVC Spring asas. Kemudian kami akan menulis Pengawal yang menerima alamat IP dalam permintaan POST dan mengembalikan respons JSON yang mengandungi bandar, garis lintang, dan garis bujur yang disimpulkan dari GeoIP2 API.

Akhirnya, kami akan menulis beberapa HTML dan JavaScript yang akan memuatkan alamat IP awam pengguna ke dalam borang, mengirimkan permintaan Ajax POST ke Pengawal kami , dan memaparkan hasilnya di Peta Google.

4.1. Kelas Entiti Respons

Mari kita mulakan dengan menentukan kelas yang akan mempunyai tindak balas geolokasi:

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

4.2. Kelas Perkhidmatan

Sekarang mari tulis kelas perkhidmatan yang mengambil data geolokasi menggunakan pangkalan data GeoIP2 Java API dan 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. Pengawal Spring

Mari kita lihat Controller for Spring MVC yang mengirimkan parameter permintaan "ipAddress" ke kelas perkhidmatan kami 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. Borang HTML

Mari tambahkan kod front-end untuk memanggil Spring Controller kami, bermula dengan borang HTML yang mengandungi alamat IP:

     ... 

4.5. Memuatkan Alamat IP Awam pada Pelanggan

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

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

4.6. Mengemukakan Permintaan POST Ajax

Apabila borang dihantar, kami akan membuat permintaan Ajax POST kepada Spring Controller untuk mengambil JSON Response dengan data geolokasi:

$( "#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. Contoh JSON Response

Respons JSON dari Spring Controller kami akan mempunyai format berikut:

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

4.8. Memaparkan Lokasi di Peta Google

Untuk memaparkan lokasi di Peta Google, anda perlu memasukkan API Peta Google dalam kod HTML anda:

Anda boleh mendapatkan Kunci API untuk Peta Google menggunakan Konsol Pembangun Google.

Anda juga perlu menentukan HTML tag untuk mengandungi gambar peta:

Anda dapat menggunakan fungsi JavaScript berikut untuk menampilkan koordinat di Peta Google:

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 }); }

Setelah memulakan aplikasi web, buka URL untuk halaman peta:

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

Anda akan melihat alamat IP awam semasa untuk sambungan anda dimuat ke dalam kotak teks:

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.

Kod untuk tutorial ini boleh didapati di laman Github.