Commit e2c40352 by songxiang

获取本机IP地址

parent 810b0b38
...@@ -3,6 +3,11 @@ ...@@ -3,6 +3,11 @@
*/ */
package com.pcloud.common.utils.nginx; package com.pcloud.common.utils.nginx;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -10,8 +15,7 @@ import org.apache.commons.lang.StringUtils; ...@@ -10,8 +15,7 @@ import org.apache.commons.lang.StringUtils;
/** /**
* @描述:Nginx工具类 * @描述:Nginx工具类
* @作者:songx * @作者:songx
* @创建时间:2016年12月3日,下午6:06:07 * @创建时间:2016年12月3日,下午6:06:07 @版本:1.0
* @版本:1.0
*/ */
public class NginxUtils { public class NginxUtils {
...@@ -20,6 +24,7 @@ public class NginxUtils { ...@@ -20,6 +24,7 @@ public class NginxUtils {
* 址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等 * 址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等
* 反向代理软件就不能获取到客户端的真实IP地址了。 * 反向代理软件就不能获取到客户端的真实IP地址了。
* 但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。 * 但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
*
* @param request * @param request
* @return * @return
*/ */
...@@ -43,6 +48,7 @@ public class NginxUtils { ...@@ -43,6 +48,7 @@ public class NginxUtils {
/** /**
* 获得浏览器请求头中的User-Agent * 获得浏览器请求头中的User-Agent
*
* @param request * @param request
* @return * @return
*/ */
...@@ -51,4 +57,48 @@ public class NginxUtils { ...@@ -51,4 +57,48 @@ public class NginxUtils {
return userAgent; return userAgent;
} }
/**
* 获取本机IP
*
* @return
* @throws UnknownHostException
*/
public static String getLocalAddress() {
try {
InetAddress candidateAddress = null;
// 遍历所有的网络接口
for (Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces(); ifaces
.hasMoreElements();) {
NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
// 在所有的接口下再遍历IP
for (Enumeration<InetAddress> inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
if (inetAddr.isSiteLocalAddress()) {
// 如果是site-local地址,就是它了
return inetAddr.getHostAddress();
} else if (candidateAddress == null) {
// site-local类型的地址未被发现,先记录候选地址
candidateAddress = inetAddr;
}
}
}
}
if (candidateAddress != null) {
return candidateAddress.getHostAddress();
}
// 如果没有发现 non-loopback地址.只能用最次选的方案
InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
if (jdkSuppliedAddress == null) {
throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
}
return jdkSuppliedAddress.getHostAddress();
} catch (Exception e) {
UnknownHostException unknownHostException = new UnknownHostException(
"Failed to determine LAN address: " + e);
unknownHostException.initCause(e);
return null;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment