java通过IP解析地理位置
一、问题描述
最近在做一个外包项目,这里要求如果定位高延迟怎么办,另外为了能够加附近的人为好友方便,所以想到了利用用户的IP进行粗略的地理位置定位。因为在写的时候遇到了一些坑,所以在这里特别记录一下,方便以后翻阅。
二、获取访问者ip
1、获取ip的java工具类
1 | public class IpUtil { |
2、获取当前的用户的HttpServletRequest
一种方法就是利用Controller层的Api接口传进来,但是这样做并不是特别好,所以这里利用了Spring,该方法直接可以在Service获得当前的 HttpServletRequest,但是要注意的是,如果又开了一个线程的话,会报空指针异常。
1 | HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); |
3、nginx配置
当项目没有额外配置nginx已经其他服务时,当前代码已经可以获得访问者的ip,但是如果配置了例如nginx,name当部署到服务器上时,总是会返回服务器的ip地址,在这里我掉坑了好久,解决方法是进行nginx的配置
1 | location / { |
三、利用IP解析地理位置
在这里其实有很多种方法了,可以利用百度的API,但是有额度限制,在这里我用的是126的API接口
http://ip.ws.126.net/ipquery?ip=IP
因为126接口无法解析成JSON格式,所以只能自己写代码进行String的拆解。首先进行接口的访问
1 | RestTemplate restTemplate=new RestTemplate(); |