IpUtils获取用户请求真实ip工具类
生活随笔
收集整理的這篇文章主要介紹了
IpUtils获取用户请求真实ip工具类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* IP工具類
* @author justin.zheng
* @date 2020/2/12 15:08
*/
public class IpUtils {
private static Logger logger = LoggerFactory.getLogger(IpUtils.class);
/**
* 獲取用戶真實IP地址,不使用request.getRemoteAddr();的原因是有可能用戶使用了代理軟件方式避免真實IP地址。
* 可是,如果通過了多級反向代理的話,X-Forwarded-For的值并不止一個,而是一串IP值,究竟哪個才是真正的用戶端的真實IP呢?
* 答案是取X-Forwarded-For中第一個非unknown的有效IP字符串
* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if("127.0.0.1".equals(ip)||"0:0:0:0:0:0:0:1".equals(ip)){
//根據網卡取本機配置的IP
InetAddress inet=null;
try {
inet = InetAddress.getLocalHost();
ip= inet.getHostAddress();
} catch (UnknownHostException e) {
logger.error("==>getIpAddr error",e);
}
}
}
if(ip!=null&&ip.length()>0){
//取第一個非unknown的有效IP字符串
String[] split = ip.split(",");
for (String s : split) {
if(!"unknown".equalsIgnoreCase(s)){
ip = s;
break;
}
}
}
return ip;
}
private IpUtils() {
}
}
總結
以上是生活随笔為你收集整理的IpUtils获取用户请求真实ip工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国产游戏春天再次来临?网传7月游戏版号开
- 下一篇: PC电脑好日子结束 AMD、Intel双