簡單介紹個自己曾經寫過的獲取ip的工具類
1.項目中獲取ip是為了后台可以追蹤到登錄網站的用戶的ip所在的地區,方便對產品的功能進行分析。
直接上代碼:
package com.hyhl.util; import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; public class IPUtil { private final static String IP_SEPARATOR = ","; /** * return 機器名 */ public static String getHostName() { try { InetAddress ia = InetAddress.getByName("127.0.0.1"); return ia.getHostName(); } catch (UnknownHostException e) { return null; } } /** * 判斷是否開發或測試機 (Hard Code) * * @param hostname */ public static boolean isDev() { String[] ips = getIps(); if (ips == null) { return false; } for (String ip : ips) { if (ip.startsWith("10.10")) { return true; } if (ip.startsWith("192.168")) { return true; } } return false; } /** * 獲取客戶端Ip * * @param request */ public static String getIP(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("x-forwarded-for"); } else { return ip; } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } else { // 當有多級反向代理時,x-forwarded-for值為多個時取第一個ip地址 if (ip.indexOf(IP_SEPARATOR) != -1) { ip = ip.substring(0, ip.indexOf(IP_SEPARATOR)); } return ip; } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } else { return ip; } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } else { return ip; } if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { ip = ""; } return ip; } /** * 獲取當前機器的所有IP */ public static String[] getIps() { List<String> ips = new ArrayList<String>(); try { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) if (netint.getHardwareAddress() != null) { List<InterfaceAddress> list = netint.getInterfaceAddresses(); for (InterfaceAddress interfaceAddress : list) { String localIp = interfaceAddress.getAddress().getHostAddress(); if (StringUtils.isNotBlank(localIp)) { // if (StringUtils.isNoneBlank(localIp)) { ips.add(localIp); } } } } catch (SocketException e1) { return null; } return ips.toArray(new String[ips.size()]); } }
2.在方法中調用的時候,直接String ip = IPUtil.getIP(request); 即可達到IP 。注意參數request是指 HttpServletRequest request