项目开发中,不管是什么应用不管是什么语言,获取ip地址是非常关键的一环,因为管是操作日志的记录还是业务的需求上都不可或缺的用到访客的ip地址,那么在java中如何获取到IP地址呢?
通常获取客户端的IP地址都是通过 request.getRemoteAddr()方法来实现,但是如何你这么做肯定就会遇到问题,很多时候会无法获取到真实的ip地址,这是因为很多站点都会进行域名的代理解析,如通过nginx反向代理,这就是导致很多时候直接使用request.getRemoteAddr()无法获取到真实ip的原因。
如何获取真实ip
通过X-Forwarded-For的值来实现真实ip的获取,如果通过了多级反向代理,X-Forwarded-For的值并不止一个,而是一串IP值。
而真实的ip值在X-Forwarded-For的值的第一个ip地址,也就是说java获取真实的ip地址就是要获取X-Forwarded-For的第一串ip地址。
实现代码
// 获取访问者的IP
public static String getIpAddress(HttpServletRequest request) {
String ip = null;
// X-Forwarded-For:Squid 服务代理
String ipAddresses = request.getHeader("X-Forwarded-For");
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
// Proxy-Client-IP:apache 服务代理
ipAddresses = request.getHeader("Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
// WL-Proxy-Client-IP:weblogic 服务代理
ipAddresses = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
// HTTP_CLIENT_IP:有些代理服务器
ipAddresses = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
// X-Real-IP:nginx服务代理
ipAddresses = request.getHeader("X-Real-IP");
}
// 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
if (ipAddresses != null && ipAddresses.length() != 0) {
ip = ipAddresses.split(",")[0];
}
// 还是不能获取到,最后再通过request.getRemoteAddr();获取
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}
// 获取自己本机电脑的所有IP
public static List getMyAddress() {
List rs = new ArrayList();
try {
Enumeration en = NetworkInterface.getNetworkInterfaces();//获取本地所有网络接口
while (en.hasMoreElements()) {//遍历枚举中的每一个元素
NetworkInterface ni= (NetworkInterface) en.nextElement();
Enumeration enumInetAddr = ni.getInetAddresses();
while (enumInetAddr.hasMoreElements()) {
InetAddress inetAddress = (InetAddress) enumInetAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) {
// sb.append("name:" + inetAddress.getHostName().toString() + "\n");
rs.add(inetAddress.getHostAddress().toString());
}
}
}
} catch (SocketException e) {}
return rs;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51