在Spring引导中获取传入请求的地理位置



我想知道用户在我们的web应用程序上的位置。该信息应包含用户的CountryCity。我找不到使用JavaSpring 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-ForX-Real-IP请求报头或类似物。您可以将其输入getGeoLocation

基于IP的地理位置可能不会给您带来原始结果。假设用户在VPN上,那么您将无法获得用户的原始位置。基于我可以获取的有限上下文,更好的解决方案是在客户端请求用户的位置权限,然后将其发送到服务器。

相关内容

  • 没有找到相关文章

最新更新