首页 > 代码库 > 服务器如何获取客户端用户的(城市)地址[获得真实IP再获得城市]

服务器如何获取客户端用户的(城市)地址[获得真实IP再获得城市]

        在web开发中,经常有需求,需要知道客户用户现在所在位置(城市),一般原理是这样,第一:先通过request对象获得远端用户的ip地址,第二:再利用第三方免费的(接口)服务,通过ip查询出用户的所在城市,

我擅长jsp,下面我们就已jsp为例:

       在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了 Apache,Nagix等反向代理(此处不懂反向代理请点击   点击打开链接 )软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP。

      经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端 IP地址和原来客户端请求的服务器地址。

      举例来说,当我们访问口碑网首页hangzhou.jsp时,其实并不是我们浏览器真正访问到了服务器上的hangzhou.jsp 文件,而是先由代理服务器Nagix去访问hagnzhou.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问hangzhou.jsp的,所以hangzhou.jsp中通过 request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。但是head中增加了X-FORWARDED-FOR,我们可以通过request.getHeader("x-forwarded-for")来判断是否是代理,

eg:

获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {
        if (request.getHeader("x-forwarded-for") == null) {
              return request.getRemoteAddr();
        }
        return request.getHeader("x-forwarded-for");
  }


------------------------------------------------------------------------------------------------------------

获得客户端真实IP地址的方法二

public String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
              ip = request.getHeader("Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
              ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
              ip = request.getRemoteAddr();
        }
        return ip;
  }

通过ip查询城市

通过网络的IP查询API 通过IP地址确定城市

这个办法IP库更新比较快。通用的库有几个比如google。

xml处理页面完全可以通过nokogiri等专门处理工具代替。

提供IP地址查询的API很多比如网易:


1.http://www.youdao.com/smartresult-xml/search.s?type=ip&q=IP地址

2. http://ip2loc.appspot.com/ #含有详细实例讲解, 但是由于GWF地址可能解析不到

3. 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

4. 新浪多地域测试方法:http://int.dpool.sina.com.cn/ipl ... amp;ip=218.192.3.42

   #这个比较全,但是有个别ip解析的不对,打个数据库没有更新吧。。。。

5. 搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson

6. 搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8

更多详细请参考:www.cnblogs.com/lwm-1988/archive/2012/07/02/2573003.html

我一般使用新浪的:int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=后面写那个ip字符串

举例:

int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42

返回一段js代码:

var remote_ip_info = {"ret":1,"start":"218.192.0.0","end":"218.192.7.255","country":"\u4e2d\u56fd","province":"\u5e7f\u4e1c","city":"\u5e7f\u5dde","district":"","isp":"\u6559\u80b2\u7f51","type":"\u5b66\u6821","desc":"\u5e7f\u5dde\u5927\u5b66\u7eba\u7ec7\u670d\u88c5\u5b66\u9662\u6559\u80b2\u7f51"};

利用eval执行这段代码:其中country代表国家或者地区,province代表省份,......

不明白的地方请留言,大家共同进步,小弟刚刚失业,如有用人需求可以call我,联系方式见个人资料,企鹅号641995773


服务器如何获取客户端用户的(城市)地址[获得真实IP再获得城市]