Java获取客户端ip

来源:互联网 发布:怎么做淘宝充值代理 编辑:程序博客网 时间:2024/05/22 03:32
某些情况下需要或取用户客户端的ip,用来统计或者拦截,比如有些网站是需要屏蔽海外ip的访问的,这就需要获取客户端的访问ip。一般情况下用HttpServletRequest对象的getRemoteAddr()方法即可获取。但是当请求经过HTTP代理或反向代理(如ngrok、nginx等)后这样获取ip是不正确的,这有点类似于跳板机。服务经过反向代理后拿到的IP已经不是"第一层"IP了,而是代理服务器这个"中介"的IP了,有时候甚至存在多级反向代理,那这个时候如何准确的获取客户端的IP呢?原来在存在代理的情况下,请求头会加上一些特定信息,如:x-forwarded-for、Proxy-Client-IP、WL-Proxy-Client-IP等来指向ip地址,于是乎获取ip变得简单起来:
public static 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;}

存在多级代理时,则取第一个非unknown的IP
public static String getIpAddrWithMultiIp(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.getHeader("HTTP_CLIENT_IP");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {        ip = request.getHeader("HTTP_X_FORWARDED_FOR");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {        ip = request.getRemoteAddr();    }    // 如果是多级代理,取第一个非unknown的ip作为客户端的ip    if (ip != null && ip.indexOf(",") != -1) {        String[] ips = ip.split(",");        for (int i = 0; i < ips.length; i++) {            String ipMulti = (String) ips[i];            if (!("unknown".equalsIgnoreCase(ipMulti))) {                ip = ipMulti;                break;            }        }    }    return ip;}

如上就可以顺利拿到客户端的ip了。顺带提下,项目中有时候需要判断上一级页面来源,用处请自行脑补。
String referer = request.getHeader("Referer");
这样即可以判断当前页面的上一级.
原创粉丝点击