1135  
Java之——获取来访者的各种信息
来源:https://blog.csdn.net/l1028386804/article/details/49890455
作者: 系统管理员 于 2019年02月11日 发布在分类 / 二次开发 / 后台 下,并于 2019年02月11日 编辑
获取 信息 阅读 阅读数 读数 访问 来自 string header 博客



转载请注明出处:http://blog.csdn.net/l1028386804/article/details/49890455

不多说,不废话,直接上代码,大家都懂的

如果要獲得nginx代理后的真实ip需要在nginx中配置

粘贴图片



package com.cdsmartlink.utils.system;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

/**
 * 获取系统的信息
 * @author liuyazhuang
 *
 */
public final class SystemUtils {
	/**
   * 获取访问者IP
   * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
   * 
   * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割),
   * 如果还不存在则调用Request .getRemoteAddr()。
   * @param request
   * @return
   */
  public static String getIpAddr(HttpServletRequest request) {
    String ip = request.getHeader("X-Real-IP");
    if (ip!= null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
      return ip;
    }
    ip = request.getHeader("X-Forwarded-For");
    if (ip!= null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
      // 多次反向代理后会有多个IP值,第一个为真实IP。
      int index = ip.indexOf(',');
      if (index != -1) {
        return ip.substring(0, index);
      } else {
        return ip;
      }
    } else {
      return request.getRemoteAddr();
    }
  }
  
  /**
   * 获取来访者的浏览器版本
   * @param request
   * @return
   */
  public static String getRequestBrowserInfo(HttpServletRequest request){
		String browserVersion = null;
		String header = request.getHeader("user-agent");
		if(header == null || header.equals("")){
		  return "";
		 }
    if(header.indexOf("MSIE")>0){
      browserVersion = "IE";
    }else if(header.indexOf("Firefox")>0){
      browserVersion = "Firefox";
    }else if(header.indexOf("Chrome")>0){
      browserVersion = "Chrome";
    }else if(header.indexOf("Safari")>0){
      browserVersion = "Safari";
    }else if(header.indexOf("Camino")>0){
      browserVersion = "Camino";
    }else if(header.indexOf("Konqueror")>0){
      browserVersion = "Konqueror";
    }
    return browserVersion;
  }

  /**
   * 获取系统版本信息
   * @param request
   * @return
   */
  public static String getRequestSystemInfo(HttpServletRequest request){
	 String systenInfo = null;
	 String header = request.getHeader("user-agent");
	 if(header == null || header.equals("")){
	  return "";
	 }
    //得到用户的操作系统
    if (header.indexOf("NT 6.0") > 0){
      systenInfo = "Windows Vista/Server 2008";
    } else if (header.indexOf("NT 5.2") > 0){
      systenInfo = "Windows Server 2003";
    } else if (header.indexOf("NT 5.1") > 0){
      systenInfo = "Windows XP";
    } else if (header.indexOf("NT 6.0") > 0){
      systenInfo = "Windows Vista";
    } else if (header.indexOf("NT 6.1") > 0){
      systenInfo = "Windows 7";
    } else if (header.indexOf("NT 6.2") > 0){
      systenInfo = "Windows Slate";
    } else if (header.indexOf("NT 6.3") > 0){
      systenInfo = "Windows 9";
    } else if (header.indexOf("NT 5") > 0){
      systenInfo = "Windows 2000";
    } else if (header.indexOf("NT 4") > 0){
      systenInfo = "Windows NT4";
    } else if (header.indexOf("Me") > 0){
      systenInfo = "Windows Me";
    } else if (header.indexOf("98") > 0){
      systenInfo = "Windows 98";
    } else if (header.indexOf("95") > 0){
      systenInfo = "Windows 95";
    } else if (header.indexOf("Mac") > 0){
      systenInfo = "Mac";
    } else if (header.indexOf("Unix") > 0){
      systenInfo = "UNIX";
    } else if (header.indexOf("Linux") > 0){
      systenInfo = "Linux";
    } else if (header.indexOf("SunOS") > 0){
      systenInfo = "SunOS";
    }
    return systenInfo;
	 }
  
  /**
   * 获取来访者的主机名称
   * @param ip
   * @return
   */
  public static String getHostName(String ip){
  	InetAddress inet;
  	try {
			inet = InetAddress.getByName(ip);
			return inet.getHostName();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
  	return "";
  } 
  
  /**
   * 命令获取mac地址
   * @param cmd
   * @return
   */
  private static String callCmd(String[] cmd) {
	 String result = "";
	 String line = "";
	  try {
	    Process proc = Runtime.getRuntime().exec(cmd);
	    InputStreamReader is = new InputStreamReader(proc.getInputStream());
	    BufferedReader br = new BufferedReader (is);
	    while ((line = br.readLine ()) != null) {
	       result += line;
	    }
	  }catch(Exception e) {
	    e.printStackTrace();
	  }
	   return result;
  }
  	/**
  	 *
  	 *
  	 *
  	 * @param cmd
  	 *      第一个命令
  	 *
  	 * @param another
  	 *      第二个命令
  	 *
  	 * @return 第二个命令的执行结果
  	 *
  	 */

  	private static String callCmd(String[] cmd,String[] another) {
  	  String result = "";
  	  String line = "";
  	  try {
  	   Runtime rt = Runtime.getRuntime();
  	   Process proc = rt.exec(cmd);
  	   proc.waitFor(); // 已经执行完第一个命令,准备执行第二个命令
  	   proc = rt.exec(another);
  	   InputStreamReader is = new InputStreamReader(proc.getInputStream());
  	   BufferedReader br = new BufferedReader (is);
  	   while ((line = br.readLine ()) != null) {
  	     result += line;
  	   }
  	  }catch(Exception e) {
  	    e.printStackTrace();
  	  }
  	   return result;
  	}

  	/**
  	 *
  	 *
  	 *
  	 * @param ip
  	 *      目标ip,一般在局域网内
  	 *
  	 * @param sourceString
  	 *      命令处理的结果字符串
  	 *
  	 * @param macSeparator
  	 *      mac分隔符号
  	 *
  	 * @return mac地址,用上面的分隔符号表示
  	 *
  	 */

  	private static String filterMacAddress(final String ip, final String sourceString
,final String macSeparator) {
  	  String result = "";
  	  String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})";
  	  Pattern pattern = Pattern.compile(regExp);
  	  Matcher matcher = pattern.matcher(sourceString);
  	  while(matcher.find()){
  	   result = matcher.group(1);
  	   if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) {
  	    break; // 如果有多个IP,只匹配本IP对应的Mac.
  	   }
  	  }
  	  return result;
  	}

  	/**
  	 * @param ip
  	 *      目标ip
  	 * @return Mac Address
  	 *
  	 */

  	private static String getMacInWindows(final String ip){
  	  String result = "";
  	  String[] cmd = {"cmd","/c","ping " + ip};
  	  String[] another = {"cmd","/c","arp -a"};
  	  String cmdResult = callCmd(cmd,another);
  	  result = filterMacAddress(ip,cmdResult,"-");
  	  return result;
  	}
  	 /**
  	 *
  	 * @param ip
  	 *      目标ip
  	 * @return Mac Address
  	 *
  	 */
  	 private static String getMacInLinux(final String ip){ 
  	   String result = ""; 
  	   String[] cmd = {"/bin/sh","-c","ping " + ip + " -c 2 && arp -a" }; 
  	   String cmdResult = callCmd(cmd); 
  	   result = filterMacAddress(ip,cmdResult,":"); 
  	   return result; 
  	 } 

  	 /**
  	 * 获取MAC地址
  	 *
  	 * @return 返回MAC地址
  	 */
  	 public static String getMacAddress(String ip){
  	   String macAddress = "";
  	   macAddress = getMacInWindows(ip).trim();
  	   if(macAddress==null||"".equals(macAddress)){
  	     macAddress = getMacInLinux(ip).trim();
  	   }
  	   return macAddress;
  	 }
}



 推荐知识

 历史版本

修改日期 修改人 备注
2019-02-11 15:45:09[当前版本] 系统管理员 格式调整
2019-02-11 08:49:16 系统管理员 CREAT

 附件

附件类型

PNGPNG

wcp知识库系统-京ICP备15024440号-1 -V 4.5.8 - 旗舰版 -WCP官网