暂无个人介绍
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明2019年08月
/**
* 获取用户实际IP地址
* @param request 当前请求对象
* @return 实际IP地址
*/
public static String getRemoteIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.trace("当前IP来源[X-Forwarded-For], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(',');
if(index != -1){
return ip.substring(0, index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
logger.trace("当前IP来源[X-Real-IP], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
return ip;
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.trace("当前IP来源[Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.trace("当前IP来源[WL-Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.trace("当前IP来源[HTTP_CLIENT_IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.trace("当前IP来源[HTTP_X_FORWARDED_FOR], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.trace("当前IP来源[getRemoteAddr], 值[{}]", ip);
}
if ("0:0:0:0:0:0:0:1".equals(ip)) {
String ipv4FromLocal = getIpv4FromLocal();
if (StringUtils.isNotEmpty(ipv4FromLocal)) {
ip = ipv4FromLocal;
}
}
return ip;
}
/**
* 获取本地IP地址
* @return IP地址
*/
private static String getIpv4FromLocal() {
String ip = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
Process process = Runtime.getRuntime().exec("cmd.exe /c ipconfig | findstr IPv4");
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = br.readLine();
ip = line.substring(line.indexOf(':') + 1).trim();
} catch (IOException e) {
logger.warn("获取本地IP异常", e);
} finally {
try {
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
logger.debug("流关闭异常", e);
}
}
return ip;
}
/**
* 获取用户实际IP地址
* @param request 当前请求对象
* @return 实际IP地址
*/
public static String getRemoteIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.trace("当前IP来源[X-Forwarded-For], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(',');
if(index != -1){
return ip.substring(0, index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
logger.trace("当前IP来源[X-Real-IP], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
return ip;
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.trace("当前IP来源[Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.trace("当前IP来源[WL-Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.trace("当前IP来源[HTTP_CLIENT_IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.trace("当前IP来源[HTTP_X_FORWARDED_FOR], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.trace("当前IP来源[getRemoteAddr], 值[{}]", ip);
}
if ("0:0:0:0:0:0:0:1".equals(ip)) {
String ipv4FromLocal = getIpv4FromLocal();
if (StringUtils.isNotEmpty(ipv4FromLocal)) {
ip = ipv4FromLocal;
}
}
return ip;
}
/**
* 获取本地IP地址
* @return IP地址
*/
private static String getIpv4FromLocal() {
String ip = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
Process process = Runtime.getRuntime().exec("cmd.exe /c ipconfig | findstr IPv4");
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = br.readLine();
ip = line.substring(line.indexOf(':') + 1).trim();
} catch (IOException e) {
logger.warn("获取本地IP异常", e);
} finally {
try {
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
logger.debug("流关闭异常", e);
}
}
return ip;
}