diff options
| author | doufenghu <[email protected]> | 2022-07-03 16:51:24 +0800 |
|---|---|---|
| committer | doufenghu <[email protected]> | 2022-07-03 16:51:24 +0800 |
| commit | 19072c6f9db2615f0560e485c82025f9b8b60c5e (patch) | |
| tree | d2b1af776221349fd3fa02c6a7e53ee611ddb24e | |
| parent | 57ea8f78be2a81c0ad94734479988af7256ea2c7 (diff) | |
Feature(IpLookup): V1.1.0 新增infoLookupToCSV和infoLookupToJSON,获取IP定位库所有属性信息。v1.1.0
| -rw-r--r-- | pom.xml | 4 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/domain/LocationResponse.java | 6 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/domain/LocationResponseV2.java | 134 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/utils/AbstractIpLookup.java | 22 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/utils/AsnLookup.java | 75 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/utils/FormatUtils.java | 2 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/utils/GalaxyDataBaseReader.java | 1 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/utils/IpLookup.java | 56 | ||||
| -rw-r--r-- | src/main/java/com/zdjizhi/utils/IpLookupV2.java | 101 | ||||
| -rw-r--r-- | src/test/java/com/zdjizhi/test/FormatUtilTest.java | 8 | ||||
| -rw-r--r-- | src/test/java/com/zdjizhi/test/IPBenchMarkTest.java | 71 | ||||
| -rw-r--r-- | src/test/java/com/zdjizhi/test/IpLookupTest.java | 8 | ||||
| -rw-r--r-- | src/test/java/com/zdjizhi/test/IpLookupV2Test.java | 65 |
13 files changed, 370 insertions, 183 deletions
@@ -7,7 +7,7 @@ <artifactId>galaxy</artifactId> <packaging>jar</packaging> <name>galaxy</name> - <version>1.0.9</version> + <version>1.1.0</version> <description>galaxy tools for common</description> <url>http://www.zdjizhi.com/galaxy-tool</url> @@ -218,7 +218,7 @@ <dependency> <groupId>com.maxmind.db</groupId> <artifactId>maxmind-db</artifactId> - <version>1.2.2</version> + <version>1.4.0</version> </dependency> diff --git a/src/main/java/com/zdjizhi/domain/LocationResponse.java b/src/main/java/com/zdjizhi/domain/LocationResponse.java index 2df8dc6..db042be 100644 --- a/src/main/java/com/zdjizhi/domain/LocationResponse.java +++ b/src/main/java/com/zdjizhi/domain/LocationResponse.java @@ -37,7 +37,7 @@ public class LocationResponse { private String countryCode; - private boolean isPrivateIP; + private boolean privateIP; @@ -147,11 +147,11 @@ public class LocationResponse { } public boolean isPrivateIP() { - return isPrivateIP; + return privateIP; } public void setPrivateIP(boolean privateIP) { - isPrivateIP = privateIP; + this.privateIP = privateIP; } } diff --git a/src/main/java/com/zdjizhi/domain/LocationResponseV2.java b/src/main/java/com/zdjizhi/domain/LocationResponseV2.java index f0b1c06..cf858ca 100644 --- a/src/main/java/com/zdjizhi/domain/LocationResponseV2.java +++ b/src/main/java/com/zdjizhi/domain/LocationResponseV2.java @@ -3,7 +3,7 @@ package com.zdjizhi.domain;/** */ import com.fasterxml.jackson.annotation.JsonProperty; - +import com.google.common.base.MoreObjects; /** * @ClassName CountryResponse @@ -26,23 +26,23 @@ public class LocationResponseV2 { private String country; - private String super_administrative_area; + private String superAdministrativeArea; - private String administrative_area; + private String administrativeArea; - private String sub_administrative_area; + private String subAdministrativeArea; private String locality; - private String dependent_locality; + private String dependentLocality; - private String double_dependent_locality; + private String doubleDependentLocality; private String organization; private String countryCode; - private boolean isPrivateIP; + private boolean privateIP; public LocationResponseV2() { @@ -53,9 +53,9 @@ public class LocationResponseV2 { public LocationResponseV2(@JsonProperty("AREA_CODE") String areaCode, @JsonProperty("ASN") String asn, @JsonProperty("ISP") String isp, @JsonProperty("LATITUDE") String latitude, @JsonProperty("LONGITUDE") String longitude, @JsonProperty("COUNTRY") String country, - @JsonProperty("SUPER_ADMINISTRATIVE_AREA") String super_administrative_area, @JsonProperty("ADMINISTRATIVE_AREA") String administrative_area, - @JsonProperty("SUB_ADMINISTRATIVE_AREA") String sub_administrative_area, @JsonProperty("LOCALITY") String locality, - @JsonProperty("DEPENDENT_LOCALITY") String dependent_locality, @JsonProperty("DOUBLE_DEPENDENT_LOCALITY") String double_dependent_locality, + @JsonProperty("SUPER_ADMINISTRATIVE_AREA") String superAdministrativeArea, @JsonProperty("ADMINISTRATIVE_AREA") String administrativeArea, + @JsonProperty("SUB_ADMINISTRATIVE_AREA") String subAdministrativeArea, @JsonProperty("LOCALITY") String locality, + @JsonProperty("DEPENDENT_LOCALITY") String dependentLocality, @JsonProperty("DOUBLE_DEPENDENT_LOCALITY") String doubleDependentLocality, @JsonProperty("ORGANIZATION") String organization, @JsonProperty("COUNTRY_CODE") String countryCode) { this.areaCode = areaCode; this.asn = asn; @@ -63,12 +63,12 @@ public class LocationResponseV2 { this.latitude = latitude; this.longitude = longitude; this.country = country; - this.super_administrative_area = super_administrative_area; - this.administrative_area = administrative_area; - this.sub_administrative_area = sub_administrative_area; + this.superAdministrativeArea = superAdministrativeArea; + this.administrativeArea = administrativeArea; + this.subAdministrativeArea = subAdministrativeArea; this.locality = locality; - this.dependent_locality = dependent_locality; - this.double_dependent_locality = double_dependent_locality; + this.dependentLocality = dependentLocality; + this.doubleDependentLocality = doubleDependentLocality; this.organization = organization; this.countryCode = countryCode; @@ -90,15 +90,6 @@ public class LocationResponseV2 { this.asn = asn; } - public String getCountry() { - return country; - } - - - public void setCountry(String country) { - this.country = country; - } - public String getIsp() { return isp; } @@ -123,76 +114,99 @@ public class LocationResponseV2 { this.longitude = longitude; } - public String getOrganization() { - return organization; + public String getCountry() { + return country; } - public void setOrganization(String organization) { - this.organization = organization; + public void setCountry(String country) { + this.country = country; } - public String getCountryCode() { - return countryCode; + public String getSuperAdministrativeArea() { + return superAdministrativeArea; } - public void setCountryCode(String countryCode) { - this.countryCode = countryCode; + public void setSuperAdministrativeArea(String superAdministrativeArea) { + this.superAdministrativeArea = superAdministrativeArea; } - public boolean isPrivateIP() { - return isPrivateIP; + public String getAdministrativeArea() { + return administrativeArea; } - public void setPrivateIP(boolean privateIP) { - isPrivateIP = privateIP; + public void setAdministrativeArea(String administrativeArea) { + this.administrativeArea = administrativeArea; } - public String getSuper_administrative_area() { - return super_administrative_area; + public String getSubAdministrativeArea() { + return subAdministrativeArea; } - public void setSuper_administrative_area(String super_administrative_area) { - this.super_administrative_area = super_administrative_area; + public void setSubAdministrativeArea(String subAdministrativeArea) { + this.subAdministrativeArea = subAdministrativeArea; } - public String getAdministrative_area() { - return administrative_area; + public String getLocality() { + return locality; } - public void setAdministrative_area(String administrative_area) { - this.administrative_area = administrative_area; + public void setLocality(String locality) { + this.locality = locality; } - public String getSub_administrative_area() { - return sub_administrative_area; + public String getDependentLocality() { + return dependentLocality; } - public void setSub_administrative_area(String sub_administrative_area) { - this.sub_administrative_area = sub_administrative_area; + public void setDependentLocality(String dependentLocality) { + this.dependentLocality = dependentLocality; } - public String getLocality() { - return locality; + public String getDoubleDependentLocality() { + return doubleDependentLocality; } - public void setLocality(String locality) { - this.locality = locality; + public void setDoubleDependentLocality(String doubleDependentLocality) { + this.doubleDependentLocality = doubleDependentLocality; } - public String getDependent_locality() { - return dependent_locality; + public String getOrganization() { + return organization; } - public void setDependent_locality(String dependent_locality) { - this.dependent_locality = dependent_locality; + public void setOrganization(String organization) { + this.organization = organization; } - public String getDouble_dependent_locality() { - return double_dependent_locality; + public String getCountryCode() { + return countryCode; } - public void setDouble_dependent_locality(String double_dependent_locality) { - this.double_dependent_locality = double_dependent_locality; + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } + + public boolean isPrivateIP() { + return privateIP; + } + + public void setPrivateIP(boolean privateIP) { + this.privateIP = privateIP; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("country", getCountry()) + .add("superAdministrativeArea", getSuperAdministrativeArea()) + .add("administrativeArea", getAdministrativeArea()) + .add("subAdministrativeArea", getSubAdministrativeArea()) + .add("organization", getOrganization()) + .add("isp", getIsp()) + .add("asn", getAsn()) + .add("latitude", getLatitude()) + .add("longitude", getLongitude()) + .toString(); } } diff --git a/src/main/java/com/zdjizhi/utils/AbstractIpLookup.java b/src/main/java/com/zdjizhi/utils/AbstractIpLookup.java index 6138713..edd055b 100644 --- a/src/main/java/com/zdjizhi/utils/AbstractIpLookup.java +++ b/src/main/java/com/zdjizhi/utils/AbstractIpLookup.java @@ -136,14 +136,32 @@ public abstract class AbstractIpLookup { * @param ip ip地址 * @return country code */ - public abstract String getCountryCode(String ip); + public abstract String countryCodeLookup(String ip); /** * A string of up to three characters containing the region-portion of the ISO 3166-2 code for the first level region associated with the IP address. * @param ip ip地址 * @return First Level Region Code */ - public abstract String getRegionCode(String ip); + public abstract String regionCodeLookup(String ip); + + /** + * This method to return all fields for CSV. + * [Location]\t[ISP]\t[Organization]\t[ASN]\t[Latitude,Longitude] + * -[Location]:Country.SuperAdministrativeArea[Province].AdministrativeArea[City][.SubAdministrativeArea][.Locality][.DependentLocality][.DoubleDependentLocality] + * -[Latitude,Longitude] : Latitude,Longitude + * @param ip + * @return + */ + public abstract String infoLookupToCSV(String ip); + + /** + * This method to return all fields for JSON. + * @param ip + * @return + */ + public abstract String infoLookupToJson(String ip); + diff --git a/src/main/java/com/zdjizhi/utils/AsnLookup.java b/src/main/java/com/zdjizhi/utils/AsnLookup.java index daf810d..8207c35 100644 --- a/src/main/java/com/zdjizhi/utils/AsnLookup.java +++ b/src/main/java/com/zdjizhi/utils/AsnLookup.java @@ -3,7 +3,7 @@ package com.zdjizhi.utils; import com.google.common.base.Joiner; import com.maxmind.db.CHMCache; import com.maxmind.geoip2.exception.AddressNotFoundException; -import com.zdjizhi.domain.LocationResponse; +import com.zdjizhi.domain.LocationResponseV2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -134,32 +134,26 @@ public class AsnLookup { if (StringUtil.isNotBlank(builder.asnDatabasePublicFile)) { - asnLocationPublicReader = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePublicFile)) - .withCache(new CHMCache()).build(); + asnLocationPublicReader = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePublicFile)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.asnDatabasePublicFileV4)) { - asnLocationPublicReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePublicFileV4)) - .withCache(new CHMCache()).build(); + asnLocationPublicReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePublicFileV4)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.asnDatabasePublicFileV6)) { - asnLocationPublicReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePublicFileV6)) - .withCache(new CHMCache()).build(); + asnLocationPublicReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePublicFileV6)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.asnDatabasePrivateFile)) { - asnLocationPrivateReader = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePrivateFile)) - .withCache(new CHMCache()).build(); + asnLocationPrivateReader = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePrivateFile)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.asnDatabasePrivateFileV4)) { - asnLocationPrivateReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePrivateFileV4)) - .withCache(new CHMCache()).build(); + asnLocationPrivateReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePrivateFileV4)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.asnDatabasePrivateFileV6)) { - asnLocationPrivateReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePrivateFileV6)) - .withCache(new CHMCache()).build(); + asnLocationPrivateReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.asnDatabasePrivateFileV6)).withCache(new CHMCache()).build(); } } @@ -290,7 +284,7 @@ public class AsnLookup { public String asnLookup(String ip) { - LocationResponse response = getResponse(ip); + LocationResponseV2 response = getResponse(ip); if (StringUtil.isEmpty(response) || response.isPrivateIP()) { return UNKNOWN; @@ -302,7 +296,7 @@ public class AsnLookup { } public String asnLookupInfo(String ip) { - LocationResponse response = getResponse(ip); + LocationResponseV2 response = getResponse(ip); if (StringUtil.isEmpty(response) || response.isPrivateIP()) { return UNKNOWN; } @@ -313,7 +307,7 @@ public class AsnLookup { public String asnLookupDetail(String ip) { - LocationResponse response = getResponse(ip); + LocationResponseV2 response = getResponse(ip); if (StringUtil.isEmpty(response) || response.isPrivateIP()) { return UNKNOWN; @@ -324,19 +318,16 @@ public class AsnLookup { - private LocationResponse getResponse(String ip) { - LocationResponse response = null; - if (!IPUtil.isIP(ip) && !IPUtil.isIPv6Address(ip)) { - throw new IllegalArgumentException("unknown ip format :" + ip ); - } - - response = new Context(new PrivateReader()).executeStragey(ip); - - if (StringUtil.isEmpty(response)) { - response = new Context(new PublicReader()).executeStragey(ip); + private LocationResponseV2 getResponse(String ip) { + LocationResponseV2 response = null; + if (IPUtil.isIPv4Address(ip) || IPUtil.isIPv6Address(ip)) { + response = new Context(new PrivateReader()).executeStragey(ip); + if (StringUtil.isEmpty(response)) { + response = new Context(new PublicReader()).executeStragey(ip); + } + } else { + throw new IllegalArgumentException("Unknown IP format :" + ip ); } - - return response; } @@ -380,7 +371,7 @@ public class AsnLookup { interface Strategy { - LocationResponse getResponse(String ip); + LocationResponseV2 getResponse(String ip); } /** @@ -388,27 +379,28 @@ public class AsnLookup { */ class PrivateReader implements Strategy { @Override - public LocationResponse getResponse(String ip) { + public LocationResponseV2 getResponse(String ip) { GalaxyDataBaseReader dataBaseReader = null; + LocationResponseV2 response = null; try { InetAddress ipAddress = InetAddress.getByName(ip); - if (IPUtil.isIP(ip)) { + if (IPUtil.isIPv4Address(ip)) { dataBaseReader = getAsnDataBaseReaderV4(ServiceEnum.PRIVATE.name()); } else if (IPUtil.isIPv6Address(ip)) { dataBaseReader = getAsnDataBaseReaderV6(ServiceEnum.PRIVATE.name()); } if (StringUtil.isNotEmpty(dataBaseReader)) { - return dataBaseReader.location(ipAddress); + response = dataBaseReader.locationV2(ipAddress); } } catch(AddressNotFoundException addressNotFoundException) { - logger.warn("Address not found ,ip is :" + ip); + logger.debug("Address not found ,ip is :" + ip); } catch (Exception e) { throw new IllegalArgumentException("ip address :" + ip +", parser error " + e); } - return null; + return response; } } /** @@ -416,12 +408,14 @@ public class AsnLookup { */ class PublicReader implements Strategy { @Override - public LocationResponse getResponse(String ip) { + public LocationResponseV2 getResponse(String ip) { GalaxyDataBaseReader dataBaseReader = null; + LocationResponseV2 response = null; + try { InetAddress ipAddress = InetAddress.getByName(ip); - if (IPUtil.isIP(ip)) { + if (IPUtil.isIPv4Address(ip)) { dataBaseReader = getAsnDataBaseReaderV4(ServiceEnum.PUBLIC.name()); } else if (IPUtil.isIPv6Address(ip)) { @@ -430,15 +424,15 @@ public class AsnLookup { } if (StringUtil.isNotEmpty(dataBaseReader)) { - return dataBaseReader.location(ipAddress); + response = dataBaseReader.locationV2(ipAddress); } } catch(AddressNotFoundException addressNotFoundException) { - logger.warn("Address not found ,ip is :" + ip); + logger.debug("Address not found ,ip is :" + ip); } catch (Exception e) { throw new IllegalArgumentException("ip address :" + ip +", parser error " + e); } - return null; + return response; } @@ -453,7 +447,8 @@ public class AsnLookup { this.strategy = strategy; } - public LocationResponse executeStragey(String ip) { + public LocationResponseV2 executeStragey(String ip) { + return strategy.getResponse(ip); } diff --git a/src/main/java/com/zdjizhi/utils/FormatUtils.java b/src/main/java/com/zdjizhi/utils/FormatUtils.java index 03a3d4d..1f55840 100644 --- a/src/main/java/com/zdjizhi/utils/FormatUtils.java +++ b/src/main/java/com/zdjizhi/utils/FormatUtils.java @@ -121,6 +121,7 @@ public class FormatUtils { /** * 获取域名的顶级私有域名 * 例如:getTopPrivateDomain('www.google.com.hk') ,返回 google.com.hk + * 公共后缀字典:https://publicsuffix.org/list/public_suffix_list.dat * @param domain 网站域名 * @return 顶级私有域名 */ @@ -133,7 +134,6 @@ public class FormatUtils { } InternetDomainName internetDomainName = InternetDomainName.from(domain); - if (internetDomainName.isUnderPublicSuffix()) { return internetDomainName.topPrivateDomain().toString(); } else { diff --git a/src/main/java/com/zdjizhi/utils/GalaxyDataBaseReader.java b/src/main/java/com/zdjizhi/utils/GalaxyDataBaseReader.java index 85c14b9..e9b5f1d 100644 --- a/src/main/java/com/zdjizhi/utils/GalaxyDataBaseReader.java +++ b/src/main/java/com/zdjizhi/utils/GalaxyDataBaseReader.java @@ -7,7 +7,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.maxmind.db.*; import com.maxmind.geoip2.exception.AddressNotFoundException; import com.maxmind.geoip2.exception.GeoIp2Exception; -import com.maxmind.geoip2.model.*; import com.zdjizhi.domain.LocationResponse; import com.zdjizhi.domain.JsonInjector; import com.zdjizhi.domain.LocationResponseV2; diff --git a/src/main/java/com/zdjizhi/utils/IpLookup.java b/src/main/java/com/zdjizhi/utils/IpLookup.java index 2e40207..80af908 100644 --- a/src/main/java/com/zdjizhi/utils/IpLookup.java +++ b/src/main/java/com/zdjizhi/utils/IpLookup.java @@ -4,6 +4,7 @@ import com.google.common.base.Joiner; import com.maxmind.db.CHMCache; import com.maxmind.geoip2.exception.AddressNotFoundException; import com.zdjizhi.domain.LocationResponse; +import com.zdjizhi.domain.LocationResponseV2; import java.io.File; import java.io.IOException; @@ -140,36 +141,29 @@ public final class IpLookup extends AbstractIpLookup{ if (StringUtil.isNotBlank(builder.ipDatabasePublicFile)) { - ipLocationPublicReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFile)) - .withCache(new CHMCache()).build(); + ipLocationPublicReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFile)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePublicFileV4)) { - ipLocationPublicReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV4)) - .withCache(new CHMCache()).build(); + ipLocationPublicReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV4)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePublicFileV6)) { - ipLocationPublicReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV6)) - .withCache(new CHMCache()).build(); + ipLocationPublicReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV6)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePrivateFile)) { - ipLocationPrivateReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFile)) - .withCache(new CHMCache()).build(); + ipLocationPrivateReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFile)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePrivateFileV4)) { - ipLocationPrivateReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV4)) - .withCache(new CHMCache()).build(); + ipLocationPrivateReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV4)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePrivateFileV6)) { - ipLocationPrivateReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV6)) - .withCache(new CHMCache()).build(); + ipLocationPrivateReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV6)).withCache(new CHMCache()).build(); } - asnLookup = new AsnLookup.Builder(false) .loadDataFile(builder.asnDatabasePublicFile) .loadDataFileV4(builder.asnDatabasePublicFileV4) @@ -433,7 +427,7 @@ public final class IpLookup extends AbstractIpLookup{ } @Override - public String getCountryCode(String ip) { + public String countryCodeLookup(String ip) { LocationResponse response = getResponse(ip); if (StringUtil.isEmpty(response)) { return UNKNOWN; @@ -442,7 +436,7 @@ public final class IpLookup extends AbstractIpLookup{ } @Override - public String getRegionCode(String ip) { + public String regionCodeLookup(String ip) { LocationResponse response = getResponse(ip); if (StringUtil.isEmpty(response)) { return UNKNOWN; @@ -451,6 +445,38 @@ public final class IpLookup extends AbstractIpLookup{ } @Override + public String infoLookupToCSV(String ip) { + LocationResponse response = getResponse(ip); + if (StringUtil.isEmpty(response)) { + return UNKNOWN; + } + StringBuilder ipInfo = new StringBuilder(); + ipInfo.append( + Joiner.on(LOCATION_SEPARATOR).useForNull("").join(response.getCountry(), response.getProvince(), response.getCity()) + ).append(OBJECT_SEPARATOR).append( + StringUtil.setDefaultIfEmpty(response.getIsp(), UNKNOWN).toString() + ).append(OBJECT_SEPARATOR).append( + StringUtil.setDefaultIfEmpty(response.getOrganization(), UNKNOWN).toString() + ).append(OBJECT_SEPARATOR).append( + asnLookup.asnLookup(ip) + ).append(OBJECT_SEPARATOR).append( + Joiner.on(LATLNG_SEPARATOR).skipNulls().join(response.getLatitude(), response.getLongitude()) + ); + + return ipInfo.toString(); + } + + @Override + public String infoLookupToJson(String ip) { + LocationResponse response = getResponse(ip); + if (StringUtil.isEmpty(response)) { + response = new LocationResponse(); + } + response.setAsn(asnLookup(ip)); + return JsonMapper.toJsonString(response); + } + + @Override public String provinceLookup(String ip) { LocationResponse response = getResponse(ip); if (StringUtil.isEmpty(response)) { diff --git a/src/main/java/com/zdjizhi/utils/IpLookupV2.java b/src/main/java/com/zdjizhi/utils/IpLookupV2.java index a16c1f6..8302e64 100644 --- a/src/main/java/com/zdjizhi/utils/IpLookupV2.java +++ b/src/main/java/com/zdjizhi/utils/IpLookupV2.java @@ -3,14 +3,12 @@ package com.zdjizhi.utils; import com.google.common.base.Joiner; import com.maxmind.db.CHMCache; import com.maxmind.geoip2.exception.AddressNotFoundException; -import com.zdjizhi.domain.LocationResponse; import com.zdjizhi.domain.LocationResponseV2; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.URL; -import java.util.Objects; import java.util.Optional; /** @@ -137,36 +135,30 @@ public final class IpLookupV2 extends AbstractIpLookup{ if (StringUtil.isNotBlank(builder.ipDatabasePublicFile)) { - ipLocationPublicReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFile)) - .withCache(new CHMCache()).build(); + ipLocationPublicReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFile)).withCache(new CHMCache()).build(); + } if (StringUtil.isNotBlank(builder.ipDatabasePublicFileV4)) { - ipLocationPublicReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV4)) - .withCache(new CHMCache()).build(); + ipLocationPublicReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV4)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePublicFileV6)) { - ipLocationPublicReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV6)) - .withCache(new CHMCache()).build(); + ipLocationPublicReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePublicFileV6)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePrivateFile)) { - ipLocationPrivateReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFile)) - .withCache(new CHMCache()).build(); + ipLocationPrivateReader = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFile)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePrivateFileV4)) { - ipLocationPrivateReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV4)) - .withCache(new CHMCache()).build(); + ipLocationPrivateReaderV4 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV4)).withCache(new CHMCache()).build(); } if (StringUtil.isNotBlank(builder.ipDatabasePrivateFileV6)) { - ipLocationPrivateReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV6)) - .withCache(new CHMCache()).build(); + ipLocationPrivateReaderV6 = new GalaxyDataBaseReader.Builder(new File(builder.ipDatabasePrivateFileV6)).withCache(new CHMCache()).build(); } - asnLookup = new AsnLookup.Builder(false) .loadDataFile(builder.asnDatabasePublicFile) .loadDataFileV4(builder.asnDatabasePublicFileV4) @@ -401,7 +393,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ return Joiner.on(LOCATION_SEPARATOR).useForNull("").join(response.getCountry(), - response.getSuper_administrative_area(), response.getAdministrative_area()); + response.getSuperAdministrativeArea(), response.getAdministrativeArea()); } @Override @@ -415,9 +407,9 @@ public final class IpLookupV2 extends AbstractIpLookup{ return PRIVATE_IP; } - return Joiner.on(LOCATION_SEPARATOR).useForNull("").join(response.getCountry(), - response.getSuper_administrative_area(), response.getAdministrative_area(), - response.getSub_administrative_area()); + return Joiner.on(LOCATION_SEPARATOR).useForNull("").join(response.getCountry(), + response.getSuperAdministrativeArea(), response.getAdministrativeArea(), + response.getSubAdministrativeArea()); } @@ -433,9 +425,9 @@ public final class IpLookupV2 extends AbstractIpLookup{ } return Joiner.on(LOCATION_SEPARATOR).useForNull("").join(response.getCountry(), - response.getSuper_administrative_area(), response.getAdministrative_area(), - response.getSub_administrative_area(), response.getLocality(), - response.getDependent_locality(), response.getDouble_dependent_locality()); + response.getSuperAdministrativeArea(), response.getAdministrativeArea(), + response.getSubAdministrativeArea(), response.getLocality(), + response.getDependentLocality(), response.getDoubleDependentLocality()); } @Override @@ -449,12 +441,12 @@ public final class IpLookupV2 extends AbstractIpLookup{ return PRIVATE_IP; } - return StringUtil.setDefaultIfEmpty(response.getAdministrative_area(), UNKNOWN).toString() ; + return StringUtil.setDefaultIfEmpty(response.getAdministrativeArea(), UNKNOWN).toString() ; } @Override - public String getCountryCode(String ip) { + public String countryCodeLookup(String ip) { LocationResponseV2 response = getResponse(ip); if (StringUtil.isEmpty(response)) { return UNKNOWN; @@ -463,7 +455,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ } @Override - public String getRegionCode(String ip) { + public String regionCodeLookup(String ip) { LocationResponseV2 response = getResponse(ip); if (StringUtil.isEmpty(response)) { return UNKNOWN; @@ -472,6 +464,43 @@ public final class IpLookupV2 extends AbstractIpLookup{ } @Override + public String infoLookupToCSV(String ip) { + LocationResponseV2 response = getResponse(ip); + if (StringUtil.isEmpty(response)) { + return UNKNOWN; + } + StringBuilder ipInfo = new StringBuilder(); + ipInfo.append( + Joiner.on(LOCATION_SEPARATOR).useForNull("").join(response.getCountry(), + response.getSuperAdministrativeArea(), response.getAdministrativeArea(), + response.getSubAdministrativeArea(), response.getLocality(), + response.getDependentLocality(), response.getDoubleDependentLocality())) + .append(OBJECT_SEPARATOR).append( + StringUtil.setDefaultIfEmpty(response.getIsp(), UNKNOWN).toString() + ).append(OBJECT_SEPARATOR).append( + StringUtil.setDefaultIfEmpty(response.getOrganization(), UNKNOWN).toString() + ).append(OBJECT_SEPARATOR).append( + asnLookup.asnLookup(ip) + ).append(OBJECT_SEPARATOR).append( + Joiner.on(LATLNG_SEPARATOR).skipNulls().join(response.getLatitude(), response.getLongitude()) + ); + + return ipInfo.toString(); + } + + + @Override + public String infoLookupToJson(String ip) { + LocationResponseV2 response = getResponse(ip); + if (StringUtil.isEmpty(response)) { + response = new LocationResponseV2(); + } + response.setAsn(asnLookup(ip)); + return JsonMapper.toJsonString(response); + } + + + @Override public String provinceLookup(String ip) { LocationResponseV2 response = getResponse(ip); if (StringUtil.isEmpty(response)) { @@ -480,7 +509,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ if (response.isPrivateIP()) { return PRIVATE_IP; } - return StringUtil.setDefaultIfEmpty(response.getSuper_administrative_area(), UNKNOWN).toString() ; + return StringUtil.setDefaultIfEmpty(response.getSuperAdministrativeArea(), UNKNOWN).toString() ; } @Override @@ -508,6 +537,8 @@ public final class IpLookupV2 extends AbstractIpLookup{ } + + @Override public String latLngLookup(String ip) { LocationResponseV2 response = getResponse(ip); @@ -545,7 +576,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ ip = Optional.ofNullable(ip).orElse("").trim(); if (!IPUtil.isIPAddress(ip)) { - throw new IllegalArgumentException("unknown ip format :" + ip ); + throw new IllegalArgumentException("Unknown IP format :" + ip ); } LocationResponseV2 response = new Context(new PrivateReader()).executeStrategy(ip); @@ -604,9 +635,9 @@ public final class IpLookupV2 extends AbstractIpLookup{ } /** - * 用户自定义IP库的执行策略 + * 用户自定义库的执行策略 */ - class PrivateReader implements Strategy { + class PrivateReader implements Strategy { @Override public LocationResponseV2 getResponse(String ip) { GalaxyDataBaseReader dataBaseReader = null; @@ -614,7 +645,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ try { InetAddress ipAddress = InetAddress.getByName(ip); - if (IPUtil.isIP(ip)) { + if (IPUtil.isIPv4Address(ip)) { dataBaseReader = getIpDataBaseReaderV4(ServiceEnum.PRIVATE.name()); } else if (IPUtil.isIPv6Address(ip)) { dataBaseReader = getIpDataBaseReaderV6(ServiceEnum.PRIVATE.name()); @@ -627,15 +658,15 @@ public final class IpLookupV2 extends AbstractIpLookup{ } catch(AddressNotFoundException addressNotFoundException) { logger.debug("Address not found ,ip is :" + ip); } catch (Exception e) { - throw new IllegalArgumentException("ip address :" + ip +", parser error " + e); + throw new IllegalArgumentException("IP address :" + ip +", parser error " + e); } return response; } } /** - * 第三方服务库的执行策略,例如maxmind、IPDAT + * 公共库(系统内置)库执行策略 */ - class PublicReader implements Strategy { + class PublicReader implements Strategy { @Override public LocationResponseV2 getResponse(String ip) { GalaxyDataBaseReader dataBaseReader = null; @@ -643,7 +674,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ try { InetAddress ipAddress = InetAddress.getByName(ip); - if (IPUtil.isIP(ip)) { + if (IPUtil.isIPv4Address(ip)) { dataBaseReader = getIpDataBaseReaderV4(ServiceEnum.PUBLIC.name()); } else if (IPUtil.isIPv6Address(ip)) { @@ -673,7 +704,7 @@ public final class IpLookupV2 extends AbstractIpLookup{ @Override public LocationResponseV2 getResponse(String ip) { LocationResponseV2 response = null; - if(IPUtil.isIP(ip) && IPUtil.internalIp(ip)) { + if(IPUtil.isIPv4Address(ip) && IPUtil.internalIp(ip)) { response = new LocationResponseV2(); response.setPrivateIP(true); } diff --git a/src/test/java/com/zdjizhi/test/FormatUtilTest.java b/src/test/java/com/zdjizhi/test/FormatUtilTest.java index 0fa1d33..6b822de 100644 --- a/src/test/java/com/zdjizhi/test/FormatUtilTest.java +++ b/src/test/java/com/zdjizhi/test/FormatUtilTest.java @@ -22,19 +22,19 @@ public class FormatUtilTest { @Test public void testGetTopDomain() { Assert.assertEquals(FormatUtils.getTopPrivateDomain("https://pan.baidu.com/s/1wejv5ZceAL0NQGExvPQm-Q#list/path=%2F&parentPath=%2Fsharelink3477893581-1028235543414583"), "baidu.com"); - Assert.assertEquals(FormatUtils.getTopPrivateDomain("www.baidu.com"), "baidu.com"); Assert.assertEquals(FormatUtils.getTopPrivateDomain("www.baidu.com.cn"), "baidu.com.cn"); Assert.assertEquals(FormatUtils.getTopPrivateDomain("www.baidu.cc"), "baidu.cc"); Assert.assertEquals(FormatUtils.getTopPrivateDomain("baidu.com.hk"), "baidu.com.hk"); Assert.assertEquals(FormatUtils.getTopPrivateDomain("baidu.com.hk:80/abc.html"), "baidu.com.hk"); - - Assert.assertEquals(FormatUtils.getTopPrivateDomain("&&&&Dddddsdd"), ""); Assert.assertEquals(FormatUtils.getTopPrivateDomain("com.cn"), ""); + Assert.assertNotEquals(FormatUtils.getTopPrivateDomain("playetoms-pa.googleapis.com"), "googleapis.com"); Assert.assertNotEquals(FormatUtils.getTopPrivateDomain("com.io"), "com.io"); - } + + + } diff --git a/src/test/java/com/zdjizhi/test/IPBenchMarkTest.java b/src/test/java/com/zdjizhi/test/IPBenchMarkTest.java new file mode 100644 index 0000000..67ff5e2 --- /dev/null +++ b/src/test/java/com/zdjizhi/test/IPBenchMarkTest.java @@ -0,0 +1,71 @@ +package com.zdjizhi.test; + +import com.zdjizhi.utils.AsnLookup; +import com.zdjizhi.utils.IpLookup; +import com.zdjizhi.utils.IpLookupV2; +import org.apache.log4j.Logger; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Random; + +public class IPBenchMarkTest { + private final static Logger logger = Logger.getLogger(IpLookupTest.class); + private final static boolean TRACE = false; + + private final static int COUNT = 1000000; + + private final static int SEED = 5; + + + private static IpLookupV2 ipLookupV2 = new IpLookupV2.Builder(false) + .loadDataFileV4("dat/ip_v4_built_in.mmdb") + .loadDataFilePrivateV6("dat/ip_v4_user_defined.mmdb") + .loadDataFileV6("dat/ip_v6_built_in.mmdb") + .loadDataFilePrivateV6("dat/ip_v6_user_defined.mmdb") + .loadAsnDataFile("dat/asn_v4.mmdb") + .loadAsnDataFileV6("dat/asn_v6.mmdb") + .build(); + + private static IpLookup ipLookup = new IpLookup.Builder(false) + .loadDataFileV4("dat/ip_v4_built_in.mmdb") + .loadDataFilePrivateV6("dat/ip_v4_user_defined.mmdb") + .loadDataFileV6("dat/ip_v6_built_in.mmdb") + .loadDataFilePrivateV6("dat/ip_v6_user_defined.mmdb") + .loadAsnDataFile("dat/asn_v4.mmdb") + .loadAsnDataFileV6("dat/asn_v6.mmdb") + .build(); + + private static AsnLookup asnLookup = new AsnLookup.Builder(false) + .loadDataFileV4("dat/asn_v4.mmdb") + .loadDataFileV6("dat/asn_v6.mmdb") + .build(); + + public static void main(String[] args) throws IOException{ + for(int i=0; i< SEED; i++) { + benchMark(COUNT, i); + } + } + + private static void benchMark(int count, int seed) throws IOException { + Random random = new Random(seed); + long startTime = System.nanoTime(); + byte[] address = new byte[4]; + for (int i = 0; i < count; i++) { + random.nextBytes(address); + InetAddress ip = InetAddress.getByAddress(address); + String ipInfo = ipLookupV2.infoLookupToJson(ip.getHostAddress()); + if (TRACE) { + if (i % 50000 == 0) { + logger.info(i + " " + ip); + logger.info(ipInfo); + } + } + } + long endTime = System.nanoTime(); + long duration = endTime - startTime; + long qps = count * 1000000000L / duration; + logger.info("Requests per second: " + qps); + } + +} diff --git a/src/test/java/com/zdjizhi/test/IpLookupTest.java b/src/test/java/com/zdjizhi/test/IpLookupTest.java index 1ed08b5..e6861c7 100644 --- a/src/test/java/com/zdjizhi/test/IpLookupTest.java +++ b/src/test/java/com/zdjizhi/test/IpLookupTest.java @@ -43,6 +43,10 @@ public class IpLookupTest { logger.info(ipLookup.organizationLookup("123.139.226.221")); logger.info(ipLookup.ispLookup("116.178.179.36")); logger.info(ipLookup.organizationLookup("116.178.179.36")); + logger.info(ipLookup.infoLookupToCSV("116.178.179.36")); + logger.info(ipLookup.infoLookupToJson("116.178.179.36")); + + } @@ -61,8 +65,8 @@ public class IpLookupTest { logger.info(ipLookup.cityLookup("120.221.155.123")); logger.info(ipLookup.countryLookup("120.221.155.223")); logger.info(ipLookup.countryLookup("120.221.155.223")); - logger.info(ipLookup.getCountryCode("120.221.155.223")); - logger.info(ipLookup.getRegionCode("120.221.155.223")); + logger.info(ipLookup.countryCodeLookup("120.221.155.223")); + logger.info(ipLookup.regionCodeLookup("120.221.155.223")); diff --git a/src/test/java/com/zdjizhi/test/IpLookupV2Test.java b/src/test/java/com/zdjizhi/test/IpLookupV2Test.java index 4748c43..b07ea04 100644 --- a/src/test/java/com/zdjizhi/test/IpLookupV2Test.java +++ b/src/test/java/com/zdjizhi/test/IpLookupV2Test.java @@ -2,29 +2,46 @@ package com.zdjizhi.test; import com.zdjizhi.utils.IpLookupV2; import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; public class IpLookupV2Test { Logger logger = Logger.getLogger(IpLookupV2Test.class); + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + IpLookupV2 ipLookup = new IpLookupV2.Builder(false) + .loadDataFileV4("dat/ip_v4_built_in.mmdb") + .loadDataFilePrivateV6("dat/ip_v4_user_defined.mmdb") + .loadDataFileV6("dat/ip_v6_built_in.mmdb") + .loadDataFilePrivateV6("dat/ip_v6_user_defined.mmdb") + .loadAsnDataFile("dat/asn_v4.mmdb") + .loadAsnDataFileV6("dat/asn_v6.mmdb") + .build(); + @Test + public void testPrivateIP() { + Assert.assertEquals(ipLookup.countryLookup("192.168.10.123"), "Private IP"); + } + + @Test(expected=IllegalArgumentException.class) + public void testIpLookupIllegalArguments(){ + ipLookup.countryLookup(""); + ipLookup.countryLookup("123"); + + } @Test public void testIpLookup() { - - IpLookupV2 ipLookup = new IpLookupV2.Builder(false) - .loadDataFileV4("dat/ip_v4_built_in.mmdb") - .loadDataFilePrivateV4("dat/ip_v4_user_defined_xj.mmdb") - .loadDataFileV6("dat/ip_v6_built_in.mmdb") - .loadDataFilePrivateV6("dat/ip_v6_user_defined.mmdb") - .loadAsnDataFile("dat/asn_v4.mmdb") - .loadAsnDataFileV6("dat/asn_v6.mmdb") - .build(); + logger.info(ipLookup.locationLookupDetail("116.178.179.36")); + logger.info(ipLookup.countryLookup("192.168.10.1")); logger.info(ipLookup.administrativeAreaLookupDetail("1.1.1.1")); - logger.info(ipLookup.locationLookupDetail("1.1.1.1")); + logger.info(ipLookup.locationLookupDetail("220.158.208.254")); logger.info(ipLookup.administrativeAreaLookupDetail("220.158.208.254")); logger.info(ipLookup.locationLookupDetail("220.158.208.254")); - logger.info( ipLookup.provinceLookup("217.71.108.0")); logger.info(ipLookup.cityLookup("217.71.108.0")); logger.info(ipLookup.cityLookupDetail("217.71.108.0")); @@ -33,22 +50,34 @@ public class IpLookupV2Test { logger.info(ipLookup.latLngLookup("217.71.108.0")); logger.info(ipLookup.cityLookupDetail("120.221.155.223")); logger.info(ipLookup.cityLatLngLookup("120.221.155.223")); - logger.info(ipLookup.asnLookup("120.221.155.223")); - logger.info(ipLookup.asnLookup("203.187.160.135")); - logger.info(ipLookup.asnLookup("116.128.133.102")); - logger.info(ipLookup.asnLookupInfo("116.128.133.102")); - logger.info(ipLookup.asnLookupDetail("116.128.133.102")); - logger.info(ipLookup.asnLookup("2001:4860:4860::8888")); logger.info(ipLookup.cityLookupDetail("202.106.0.20")); logger.info(ipLookup.ispLookup("123.139.226.221")); logger.info(ipLookup.organizationLookup("123.139.226.221")); logger.info(ipLookup.ispLookup("116.178.179.36")); logger.info(ipLookup.organizationLookup("116.178.179.36")); - + logger.info(ipLookup.infoLookupToJson("192.168.10.1")); + logger.info(ipLookup.infoLookupToCSV("120.221.155.223")); + logger.info(ipLookup.infoLookupToJson("120.221.155.223")); } + @Test + public void testAsnLookup() { + + logger.info(ipLookup.asnLookup("120.221.155.223")); + logger.info(ipLookup.asnLookup("203.187.160.135")); + logger.info(ipLookup.asnLookup("116.128.133.102")); + logger.info(ipLookup.asnLookupInfo("116.128.133.102")); + logger.info(ipLookup.asnLookupDetail("116.128.133.102")); + logger.info(ipLookup.asnLookup("2001:4860:4860::8888")); + logger.info(ipLookup.asnLookup("0.1.1.1")); + + + } + + + |
