使用request.getRemoteAddr(),只能获取内网的电脑IP,。如果是在外网,只能获得网关的IP,请教一下大家,如何获取到客户端的IP和MAC网卡地址

解决方案 »

  1.   

    String clientIp = request.getHeader("x-forwarded-for");
    if ((clientIp == null) || (clientIp.length() == 0)
    || ("unknown".equalsIgnoreCase(clientIp))) {
    clientIp = request.getHeader("Proxy-Client-IP");
    }
    if ((clientIp == null) || (clientIp.length() == 0)
    || ("unknown".equalsIgnoreCase(clientIp))) {
    clientIp = request.getHeader("WL-Proxy-Client-IP");
    }
    if ((clientIp == null) || (clientIp.length() == 0)
    || ("unknown".equalsIgnoreCase(clientIp))) {
    clientIp = request.getRemoteAddr();
    }
    return clientIp;
    然后再转一下 
    String[] ips = clientIp.split("[.]");
    StringBuffer sb = new StringBuffer();
    sb.append(ips[0]);
    for(int i=1;i<ips.length;i++){
    if(ips[i].length()==1){
    sb.append("00"+ips[i]);
    }else if(ips[i].length()==2){
    sb.append("0"+ips[i]);
    }else{
    sb.append(ips[i]);
    }
    }
    return Long.parseLong(sb.toString());
      

  2.   

    MAC 地址获得不到!TCP/IP 并不会把 MAC 地址传过来,你咋获得?
      

  3.   

    +1IP可以获取,客户端的MAC哪位牛人可以获取到?
      

  4.   

    IP是可以获得,但是MAC用上面的不能获取到
      

  5.   

    基本上两招:
    1、借助ActiveX,获取到MAC地址;
    2、攻破浏览器安全保护,执行本地代码获取MAC地址。
      

  6.   

    内网是可以 。
    内网通过 nbtstat -a ipAddress  能够得到mac地址BufferedReader is = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("nbtstat -a 192.168.1.139").getInputStream()));
    //得到输入里,然后读取内容, 截取MAC地址。
    如果要得到外网mac地址 , 主要是要得到外网IP地址 , 这个没试过 。
      

  7.   

    内网地址,我知道怎么取,但是外网的MAC地址,不知道怎么取
      

  8.   

    mac没有获取过
    ip可以获取的 //获取ip地址
    public 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.getRemoteAddr();
    }
    return ip;
    }
      

  9.   

    都不行,有很多机子,nbtstat -a ip 都是空的 nbtstat这个先免了
      

  10.   


    正解楼主这样的问题CSDN每周都会出现几次。
    叫人说啥好呢?基础知识薄弱。
      

  11.   

    我因为项目需求也需要获得客户端的ip和mac地址。自己弄了三天,还是没有完美的方案。弄了一个版本只能在自己公司局域网里实现,但是在广域网不能实现。想来思去,紧紧通过客户端访问服务器就能获得客户端mac地址有点不可能。也只有用控件,但是用空间的话,用户体验大大降低,而且浏览器使用比较局限行。如下是我的代码:
    <%
                    String sip="";
                    String smac="";
                    sip = request.getHeader("x-forwarded-for");
                    if(sip == null ||sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
                    {
                            sip = request.getHeader("proxy-Client-IP");
                    }
                    if (sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
                    {
                     sip = request.getHeader("WL-Proxy-Client-IP");
                    }  
                    if (sip == null ||sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
                    {
                     sip = request.getRemoteAddr();
                    }
            //本机过滤掉
            if(!"127.0.0.1".equals(sip))
            {
             //Process process = Runtime.getRuntime().exec("nbtstat -a " + sip);
                     //InputStreamReader ir = new InputStreamReader(process.getInputStream());
                     //LineNumberReader input = new LineNumberReader(ir);
                     //String line;
                            //while ((line = input.readLine()) != null)
                     //if (line.indexOf("MAC Address") > 0)
                     //{
                            //smac = line.substring(line.indexOf("-") - 2);
                     //}System.out.println(str.substring(str.indexOf("at")+2, str.indexOf("[ether]")).trim());
                     Process process = Runtime.getRuntime().exec("arp -a " + sip);
                     InputStreamReader ir = new InputStreamReader(process.getInputStream());
                     LineNumberReader input = new LineNumberReader(ir);
                     String line;
                            while ((line = input.readLine()) != null)
                     if (line.indexOf("at") > 0)//找到at标识的一行
                     {
                            smac = line.substring(line.indexOf("at")+2, line.indexOf("[ether]")).trim();
                     }
                    
            }
            out.println(smac);
            out.println("<br>");
            out.println(sip);
    %> 
    打“//”注释起来的是服务端部署在windows下,没打“//”是部署在liunx上。但以上也只能在局域网里使用。在外网不行。放在外网上ip也是中间代理的ip。解决ip似乎还可以,但是获得mac还是不行。如是我调整设计策略,用不同的方式来绑定客户端的ip和电脑。但是这样还是有bug,不过还是能满足大多数用户。弄完这个后自己想了想,没做之前盲目在网上找资料,浪费了很多时间。现在想想简单的从TCP/IP协议里获得客户端ip和mac有点难度,我们系统也不是c/s模式。网上有好多网站投票貌似一台机器只能投一次,如果细心可以发现过段时间还可以投票,有的网站是需要运行或下载插件。关于这个问题,如果大家还有很好的方法可以提出来探讨一下。
      

  12.   

    就算你能获取 PC上也可以再改MAC地址 你这样做又有什么用呢
    IP?那就更不用说了,在B/S上做这个需求本身就是拍脑袋的事。
    自己以为很高明其实弱得一笔