package com.chinacreator.videoalliance.order.util; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; public class IpAddrUtil { private static Logger logger = Logger.getLogger("iplog"); public static String getIpAddr2(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (inValidateIpAddr2(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (inValidateIpAddr2(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (inValidateIpAddr2(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (inValidateIpAddr2(ip)) { ip = request.getHeader("clientip"); } if (inValidateIpAddr2(ip)) { ip = request.getRemoteAddr(); } if (inValidateIpAddr2(ip)) { ip = "null"; } else { int index = ip.indexOf(","); if (index != -1) { ip = ip.substring(0, index); } } return ip; } private static boolean inValidateIpAddr2(String ip) { return (ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip)); } public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (inValidateIpAddr(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (inValidateIpAddr(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (inValidateIpAddr(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (inValidateIpAddr(ip)) { ip = request.getHeader("clientip"); } if (inValidateIpAddr(ip)) { ip = request.getRemoteAddr(); } if (inValidateIpAddr(ip)) { ip = "null"; } else { int index = ip.indexOf(","); if (index != -1) { ip = ip.substring(0, index); } } return ip; } /** * ip地址是否有效 * * @param ip * @return true:无效,false有效 */ private static boolean inValidateIpAddr(String ip) { return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || ip.startsWith("10.") || ip.startsWith("172.") || ip.startsWith("192."); } public static String getHostIp() { try { Enumeration en = NetworkInterface.getNetworkInterfaces(); while (en.hasMoreElements()) { NetworkInterface intf = (NetworkInterface) en.nextElement(); Enumeration enumIpAddr = intf.getInetAddresses(); while (enumIpAddr.hasMoreElements()) { InetAddress inetAddress = (InetAddress) enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException e) { e.printStackTrace(); } return null; } /** * 获取所有IP * @param request * @param channel * @return */ public static List getIpAddrList(HttpServletRequest request, String channel) { printHeader(request, channel); return getHeaderIps(request,channel); } /** * 输出IP地址信息 * @param request */ private static StringBuffer printHeader(HttpServletRequest request, String channel){ StringBuffer sb = new StringBuffer(); //sb.append("==============渠道=>"+channel+", header信息==============\r\n"); //logger.info("remoteaddr=>"+request.getRemoteAddr()); sb.append("name=>remoteaddr, value=>"+request.getRemoteAddr()+"\r\n"); Enumeration er = request.getHeaderNames();//获取请求头的所有name值 while(er.hasMoreElements()){ String name =(String) er.nextElement(); String value = request.getHeader(name); sb.append("name=>"+name+", value=>"+value+"\r\n"); } logger.info("\r\n================渠道=>"+channel+"的header信息=>\r\n"+sb.toString()); return sb; } /*** * 到请求头获取所有IP地址 * @param request * @param channel 调用渠道标识 * @param remoteAddrChannel 需要取remoteAddr的IP的渠道 * @return */ public static List getHeaderIps(HttpServletRequest request, String channel) { List ipList = new ArrayList(); addIps(ipList,request.getHeader("X-Forwarded-For")); addIps(ipList,request.getHeader("X-Real-IP")); addIps(ipList,request.getHeader("Proxy-Client-IP")); addIps(ipList,request.getHeader("WL-Proxy-Client-IP")); addIps(ipList,request.getHeader("clientip")); //X-Forwarded-For无值再到getRemoteAddr取 if(StringUtils.isEmpty(request.getHeader("X-Forwarded-For"))){ //是否有限制取remoteaddr的渠道 addIps(ipList,request.getRemoteAddr()); } return ipList; } /** * 添加IP到List,重复IP不添加 * @param ipList * @param getip */ private static void addIps(List ipList, String getip){ //IP不能为空 if(StringUtils.isNotEmpty(getip)){ //可能有多个IP,用,分隔 String [] arrayip = getip.split(","); for(String tmp : arrayip){ if(StringUtils.isNotEmpty(tmp) && StringUtils.isNotEmpty(tmp.trim()) && !ipList.contains(tmp.trim())){ //添加数据,重复不添加 ipList.add(tmp.trim()); } } } } }