我想知道用户在我们的web应用程序上的位置。该信息应包含用户的Country
和City
。我找不到使用Java
或Spring Boot
的好方法。我试过使用GeoLite2-City
,但它给了我一个例外,说The address 10.212.134.200 is not in the database.
我也在我的localhost
上用ip127.0.0.1
得到了这个例外。以下是我使用过的代码:
// String ipAddress = httpServletRequest.getRemoteAddr();
public String getGeoLocation(String ipAddress) {
String geoLocation = "";
try {
File database = ResourceUtils.getFile("classpath:GeoLite2-City/GeoLite2-City.mmdb");;
DatabaseReader dbReader = new DatabaseReader.Builder(database).build();
CityResponse response = dbReader.city(InetAddress.getByName(ipAddress));
String countryName = response.getCountry().getName();
String cityName = response.getCity().getName();
String postal = response.getPostal().getCode();
String state = response.getLeastSpecificSubdivision().getName();
geoLocation = "Country: " + countryName + "cityName: " + cityName + "postal: " + postal + "state: " + state;
System.out.println(geoLocation);
} catch(Exception ex) {
logger.error("Exception occured while trying to get GeoLocation of user: " + ex);
}
return geoLocation;
}
但我总是很例外。
我只下载并添加了Geolite2-city
文件。我也没有确认我是否需要添加任何其他文件。我添加的依赖项是:
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.8.0</version>
</dependency>
注:
GeoLite2是我获取用户地理位置的方法之一。如果你有更好的API或建议,请建议我一个更好的方式来获得用户当前的地理位置10.212.134.200和127.0.0.1是只有在网络内部或机器内部才有意义的地址,而不是在互联网上。MaxMind无法知道它们的位置。(你可以通过看窗外来判断你在哪个城市。(
如果请求实际上来自互联网,那么来自网络之外,它可能会被代理。如果是这种情况,则代理可能已经添加了包含原始请求者的外部("真实"(IP地址的X-Forwarded-For
或X-Real-IP
请求报头或类似物。您可以将其输入getGeoLocation
。
基于IP的地理位置可能不会给您带来原始结果。假设用户在VPN上,那么您将无法获得用户的原始位置。基于我可以获取的有限上下文,更好的解决方案是在客户端请求用户的位置权限,然后将其发送到服务器。