package com.xxx.xxx.common.util;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 从请求中获取客户端信息,包括:IP, System, Browser
*/
public class ClientInfoUtils {
private static final String UNKNOWN = "unknown";
public static HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
}
/**
* 获取请求 IP
* 使用 Nginx 等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址
* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,
* X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址
*
* @return IP 地址
*/
public static String getIpAddr() {
HttpServletRequest request = getHttpServletRequest();
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.getRemoteAddr();
if (ip.equals("127.0.0.1")) { // 根据网卡取本机配置的 IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
ip = inet.getHostAddress();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 多个代理的情况,第一个 IP 为客户端真实 IP,多个 IP 按照','分割
if (ip != null && ip.length() > 15) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
//return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
/**
* 获取用户操作系统
* @return
*/
public static String getSystem() {
JSONObject jsonObject = getSystemBrowser();
return jsonObject.getString("system");
}
/**
* 获取用户浏览器
* @return
*/
public static String getBrowser() {
JSONObject json = getSystemBrowser();
return json.getString("browser");
}
/**
* 获取用户操作系统、浏览器
* @return
*/
public static JSONObject getSystemBrowser() {
HttpServletRequest request = getHttpServletRequest();
StringBuilder userAgent = new StringBuilder("[");
userAgent.append(request.getHeader("User-Agent"));
userAgent.append("]");
int indexOfMac = userAgent.indexOf("Mac OS X");
int indexOfWindows = userAgent.indexOf("Windows NT");
int indexOfIe = userAgent.indexOf("MSIE");
int indexOfIe11 = userAgent.indexOf("rv:");
int indexOfFirefox = userAgent.indexOf("Firefox");
int indexOfSogou = userAgent.indexOf("MetaSr");
int indexOfChrome = userAgent.indexOf("Chrome");
int indexOfSafari = userAgent.indexOf("Safari");
boolean isMac = indexOfMac > 0;
boolean isWindows = indexOfWindows > 0;
boolean isLinux = userAgent.indexOf("Linux") > 0;
boolean containIe = indexOfIe > 0 || (isWindows && (indexOfIe11 > 0));
boolean containFirefox = indexOfFirefox > 0;
boolean containSogou = indexOfSogou > 0;
boolean containChrome = indexOfChrome > 0;
boolean containSafari = indexOfSafari > 0;
String browser = "";
if (containSogou) {
if (containIe) {
browser = "搜狗" + userAgent.substring(indexOfIe, indexOfIe + "IE x.x".length());
} else if (containChrome) {
browser = "搜狗" + userAgent.substring(indexOfChrome, indexOfChrome + "Chrome/xx".length());
}
} else if (containChrome) {
browser = userAgent.substring(indexOfChrome, indexOfChrome + "Chrome/xx".length());
} else if (containSafari) {
int indexOfSafariVersion = userAgent.indexOf("Version");
browser = "Safari "
+ userAgent.substring(indexOfSafariVersion, indexOfSafariVersion + "Version/x.x.x.x".length());
} else if (containFirefox) {
browser = userAgent.substring(indexOfFirefox, indexOfFirefox + "Firefox/xx".length());
} else if (containIe) {
if (indexOfIe11 > 0) {
browser = "IE 11";
} else {
browser = userAgent.substring(indexOfIe, indexOfIe + "IE x.x".length());
}
}
String os = "";
if (isMac) {
os = userAgent.substring(indexOfMac, indexOfMac + "MacOS X xxxxxxxx".length());
} else if (isLinux) {
os = "Linux";
} else if (isWindows) {
os = "Windows ";
String version = userAgent.substring(indexOfWindows + "Windows NT".length(), indexOfWindows
+ "Windows NTx.x".length());
switch (version.trim()) {
case "5.0":
os += "2000";
break;
case "5.1":
os += "XP";
break;
case "5.2":
os += "2003";
break;
case "6.0":
os += "Vista";
break;
case "6.1":
os += "7";
break;
case "6.2":
os += "8";
break;
case "6.3":
os += "8.1";
break;
case "10":
os += "10";
default:
break;
}
}
JSONObject json = new JSONObject();
json.put("system", os);
json.put("browser", StringUtils.replace(browser, "/", " "));
return json;
}
/**
* 获取当前计算机 IP
*/
public static String getHostIp() {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return "127.0.0.1";
}
/**
* 获取当前计算机名称
*/
public static String getHostName() {
try {
return InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return "未知";
}
}