首页 > 其他分享 >日志获取ip

日志获取ip

时间:2022-11-16 20:33:45浏览次数:40  
标签:return String 获取 indexOf ip else header 日志

package com.iflytek.ggaq.jz.fk.util;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 获取系统的信息
 * @author zcchu
 *
 */
public final class SystemUtils {


    private static Map<String, IPMac> ipMac = new HashMap<>();

    /**
     * 获取访问者IP
     * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
     * 
     * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割),
     * 如果还不存在则调用Request .getRemoteAddr()。
     * @return
     */
    public static String getIpAddr() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        return getIpAddr(request);
    }
    
    /**
     * 获取访问者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 = "";
       try {
           String[] cmd = {"cmd","/c","ping " + ip};
           String[] another = {"cmd","/c","arp -a"};
           String cmdResult = callCmd(cmd,another);
           result = filterMacAddress(ip,cmdResult,"-");
       }catch (Exception e) {
           result = null;
       }
       return result;
    }
     /**
      *
      * @param ip
      *            目标ip
      * @return Mac Address
      *
      */
     private static String getMacInLinux(final String ip){ 
         String result = ""; 
         try {
             String[] cmd = {"/bin/sh","-c","ping " +  ip + " -c 1 && arp -a" };
             String cmdResult = callCmd(cmd); 
             result = filterMacAddress(ip, cmdResult, ":"); 
         }catch (Exception e) {
            result = null;
        }
         return result; 
     } 
 
     /**
      * 获取MAC地址
      *
      * @return 返回MAC地址
      */
     public static String getMacAddress(String ip){
         if(ipMac.containsKey(ip)){
            IPMac lastIpMac = ipMac.get(ip);
            if(System.currentTimeMillis() - lastIpMac.lastTime.getTime() < 1800000){
                return lastIpMac.mac;
            }
        }
        String macAddress = "";
         String osName = System.getProperty("os.name").toLowerCase();
         if (osName.startsWith("win")) {
            macAddress = getMacInWindows(ip).trim();
        }
        else {
            macAddress = getMacInLinux(ip).trim();
        }
         ipMac.put(ip, new IPMac(ip, macAddress, new Date()));
         return macAddress;
     }
}

class IPMac{
    protected String ip;

    protected String mac;

    protected Date lastTime;

    public IPMac(String ip, String mac, Date lastTime) {
        this.ip = ip;
        this.mac = mac;
        this.lastTime = lastTime;
    }
}

 

标签:return,String,获取,indexOf,ip,else,header,日志
From: https://www.cnblogs.com/JYB2021/p/16897409.html

相关文章

  • openstack绑定浮动IP时提示无可用端口
    提示: 当前网络拓扑:感觉一切都正常啊,但是就是提示无可用端口!!!!!  最终解决: (1)检查一下连接外网的这个路由器连外网的接口类型,如果是router-interface,那么应该就会提......
  • maven在eclipse中无法加入
    实际情况是没有添加buildpath。问题:选择工程----->右键---->JavaBuildPath—->Libraries---->AddLibrary---->next---->finish后,Libraries下看不到......
  • Nginx开启Gzip压缩大幅提高页面加载速度
    刚刚给博客加了一个500px相册插件,lightbox引入了很多js文件和css文件,页面一下子看起来非常臃肿,所以还是把Gzip打开了。环境:Debian61、Vim打开Nginx配置文件vim /usr/local......
  • 11.16 NOIP模拟赛
    A.长春花给定一个素数p,对每个0≤x<p,设f(x)表示一个最小的非负整数a,使得存在一个非负整数b,满足(a2+b2)modp=x。现在,你想要求max{f(0),f(1),⋯,f(p−1)}的值。......
  • 反射获取static静态变量
    我们知道,静态变量是在类的实例化之前就进行了初始化(类的初始化阶段),所以静态变量是跟着类本身走的,跟具体的对象无关,所以我们获取变量就不需要传入对象,直接传入null即可:1......
  • 用JavaScript 实现断点续传 (HTTP)
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持......
  • 如何获取DataFrame的列名
    如何获取DataFrame的列名或列名列表通过columns以及keys()属性columns属性返回Index,columns.values属性返回 numpy.ndarray,然后可以通过tolist(),或者list(ndarray)转......
  • JavaScript语法变量以及变量typeof
    JavaScript-语法-变量变量:一小块存储数据的内存空间(一片存储数据的内存区域)Java语言是强类型语言,而JavaScript是弱类型语言强类型:规定类型(在开辟变量存储空间时,定义了......
  • AIPHD科技文教产品矩阵体验设计
    AIPHD科技文教专注于科技文教,由AIPHD公众号,AIPHD英语、AI智能古诗、AIPHD科技心理等具有独立功能的APP产品矩阵组成,同时将AIMANT星球作为情感辅助。AIPHD系列更注重于大学......
  • 快速远程不同局域网的电脑【windows自带的远程桌面、无需公网IP】
    Windows自带的远程桌面,一直都很好用,在同个局域网下,通过电脑IP地址,以及账号密码,就可以轻松实现远程桌面控制,而无需第三方远程软件。但疫情当下,或者出差在外,难免会遇到需要......