NetWorkUtil.java 2.27 KB
package cn.chnmuseum.party.common.util;

import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.servlet.http.HttpServletRequest;

public class NetWorkUtil {

	public static String getLoggableAddress(HttpServletRequest request) {
		if (request == null) {
			return null;
		}

		// X-Forwarded-For:Squid 服务代理
		String ipAddress = request.getHeader("X-Forwarded-For");
		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
			// Proxy-Client-IP:apache 服务代理
			ipAddress = request.getHeader("Proxy-Client-IP");
		}
		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
			// WL-Proxy-Client-IP:weblogic 服务代理
			ipAddress = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
			// HTTP_CLIENT_IP:有些代理服务器
			ipAddress = request.getHeader("HTTP_CLIENT_IP");
		}
		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
			// X-Real-IP:nginx服务代理
			ipAddress = request.getHeader("X-Real-IP");
		}
		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
			ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
		}
		// 有些网络通过多层代理(路由),那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
		if (ipAddress != null && ipAddress.length() != 0) {
			// 多个时,取第一个非unknown的ip
			final String[] arr = ipAddress.split(",");
			for (final String str : arr) {
				if (!"unknown".equalsIgnoreCase(str)) {
					ipAddress = str;
					break;
				}
			}
		}
		if (("127.0.0.1").equals(ipAddress) || ("0:0:0:0:0:0:0:1".equals(ipAddress))) {
			// 根据网卡取本机配置的IP
			InetAddress inet = null;
			try {
				inet = InetAddress.getLocalHost();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			}
			ipAddress = inet.getHostAddress();
		}
		// 还是不能获取到,最后再通过request.getRemoteAddr();获取
		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
			ipAddress = request.getRemoteAddr();
		}
		return ipAddress;
	}

}