GeoLite2를 사용하여 IP 주소에서 국가 및 도시 검색
6928 단어 Java
더 높은 정밀도의 GeoIP는 유상이지만 GeoLite2는Creative Commons(디스플레이·상속) 허가증으로 무료로 발급된다.
또 이 데이터베이스를 활용한 GeoIP2 라이브러리도 이 회사의 GiitHub에서 다양한 언어 버전을 배포했다.Java 버전의 라이브러리는 여기에 있습니다.
이 GiitHub 페이지의 설명은 주로 웹 서비스 버전의 클라이언트와 유상 DB의 사용 방법을 설명하지만, 무료 버전의 GeoLite2도 이 프로그램 라이브러리를 사용할 수 있어 문제없이 사용할 수 있다.
GeoLite2를 사용할 때 RDB를 설치하지 않아도 되는 등 메모리에서 데이터를 읽어 활용할 수 있어 간단하다.비록 정밀도는 매우 낮지만, 나는 대충 국명을 붙이기만 하면 충분하다고 생각한다.로그 등을 분석하기 위해 대량의 IP 주소에 국가 정보를 추가하고 싶을 때 편리하다.
사용법
일반적인 Maven 프로젝트의 경우 사용 방법을 설명합니다.
프로젝트에 GeoIP2 라이브러리 추가
pom.xml<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.2.0</version>
</dependency>
GeoLite2 데이터베이스를 다운로드하여 압축 해제 프로젝트에 추가
위 페이지에서 GeoLite 2 City 또는 GeoLite 2 Country Database의 "MaxMind DB binary"버전을 다운로드하여 동결해제하십시오.해동시 크기에 도시정보가 포함된 시티 에디션은 35MB 정도이며, 국가정보만 있는 카운터리 에디션은 10분의 1 정도다.
데이터베이스 파일을 읽는 방법에 관해서, 이번 예는 클래스 마운트를 통해 읽는 것이다src/main/resource 디렉터리 아래에 샘플 패키지와 같은 차원의 디렉터리를 만들고 데이터베이스 파일을 설치합니다.
샘플 코드
qiita.나는 com의 지리 정보를 얻으러 왔다.이 예에서 도시명을 얻을 수 있지만 실제로 도시명을 얻을 수 있다면 행운의 정도를 고려하는 것이 좋다.
public class GeoLiteSample {
public static void main(String[] args) throws Exception {
// クラスパスからデータベースファイルを読み込むInputStreamを作成
InputStream in = GeoLiteSample.class.getResourceAsStream("GeoLite2-City.mmdb");
// DatabaseReader.Builderクラスを用いてInputStreamからDatabaseReaderオブジェクトを作成
DatabaseReader cityDB = new DatabaseReader.Builder(in).build();
// 都市情報を問い合わせ。引数はInetAddressオブジェクトです
CityResponse res = cityDB.city(InetAddress.getByName("www.qiita.com"));
// 大陸名を表示 -> Asia
System.out.println(res.getContinent().getName());
// 国名を表示 -> Japan
System.out.println(res.getCountry().getName());
// 地域名を表示 -> Tōkyō (東京都)
// 日本の場合LeastSpecificSubdivisionもMostSpecificSubdivisionも県名
System.out.println(res.getLeastSpecificSubdivision().getName());
System.out.println(res.getMostSpecificSubdivision().getName());
// 都市名を表示 -> Tokyo
System.out.println(res.getCity().getName());
// 各地域情報からは国コードや言語別の表示名を取得出来ます
// 国コード -> JP
System.out.println(res.getCountry().getIsoCode());
// 日本語での地域名 -> 東京都
System.out.println(res.getLeastSpecificSubdivision().getNames().get("ja"));
// 緯度・経度・タイムゾーン -> [latitude=35.685, longitude=139.7514, timeZone=Asia/Tokyo]
System.out.println(res.getLocation());
}
}
Reference
이 문제에 관하여(GeoLite2를 사용하여 IP 주소에서 국가 및 도시 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sugibuchi/items/73c18f2747f95d7fa87a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.2.0</version>
</dependency>
public class GeoLiteSample {
public static void main(String[] args) throws Exception {
// クラスパスからデータベースファイルを読み込むInputStreamを作成
InputStream in = GeoLiteSample.class.getResourceAsStream("GeoLite2-City.mmdb");
// DatabaseReader.Builderクラスを用いてInputStreamからDatabaseReaderオブジェクトを作成
DatabaseReader cityDB = new DatabaseReader.Builder(in).build();
// 都市情報を問い合わせ。引数はInetAddressオブジェクトです
CityResponse res = cityDB.city(InetAddress.getByName("www.qiita.com"));
// 大陸名を表示 -> Asia
System.out.println(res.getContinent().getName());
// 国名を表示 -> Japan
System.out.println(res.getCountry().getName());
// 地域名を表示 -> Tōkyō (東京都)
// 日本の場合LeastSpecificSubdivisionもMostSpecificSubdivisionも県名
System.out.println(res.getLeastSpecificSubdivision().getName());
System.out.println(res.getMostSpecificSubdivision().getName());
// 都市名を表示 -> Tokyo
System.out.println(res.getCity().getName());
// 各地域情報からは国コードや言語別の表示名を取得出来ます
// 国コード -> JP
System.out.println(res.getCountry().getIsoCode());
// 日本語での地域名 -> 東京都
System.out.println(res.getLeastSpecificSubdivision().getNames().get("ja"));
// 緯度・経度・タイムゾーン -> [latitude=35.685, longitude=139.7514, timeZone=Asia/Tokyo]
System.out.println(res.getLocation());
}
}
Reference
이 문제에 관하여(GeoLite2를 사용하여 IP 주소에서 국가 및 도시 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sugibuchi/items/73c18f2747f95d7fa87a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)