如果用request.getRemoteAddr()获取的话,获取的客户端IP都是同一个地址,应该是路由器的IP地址。请问如何可以获取到客户端在局域网里面的IP地址呢???  

解决方案 »

  1.   

    2008-04-02 16:59最近做一个安全系统,需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户端ip和mac地址的两个方法,留存。1.获取客户端ip地址( 这个必须从客户端传到后台):
       jsp页面下,很简单,request.getRemoteAddr() ;
       因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换
       public String getMyIP() {
            try {
                FacesContext fc = FacesContext.getCurrentInstance();
                HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest();
                return request.getRemoteAddr();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        }2.获取客户端mac地址
        调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:    public String getMACAddress(String ip){
            String str = "";
            String macAddress = "";
            try {
                Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
                InputStreamReader ir = new InputStreamReader(p.getInputStream());
                LineNumberReader input = new LineNumberReader(ir);
                for (int i = 1; i < 100; i++) {
                    str = input.readLine();
                    if (str != null) {
                        if (str.indexOf("MAC Address") > 1) {
                            macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());
                            break;
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace(System.out);
            }
            return macAddress;
     
      

  2.   

    不可能 假如你局域网下面有两台机器一台的ip地址是: 192.168.1.100 这台作为服务器部署你的应用程序然后另外一台: 192.168.1.101 去访问这个服务器部署的应用  服务端获取到的IP肯定是 192.168.1.101你自己本地用localhost访问时测试不出来效果的。
      

  3.   

    request.getServerName()==Server Name
    request.getServerPort()==Server Port
    request.getRemoteAddr()==Remote Addr
    request.getRemoteHost()==Remote Host
      

  4.   

    这样说的话,那么用request.getRemoteAddr()同样是可以获取同一局域网里客户端的IP地址了吗???  但是,现在我在自己的机子上部署程序,同一局域网里面的机器访问我的程序的话,都是一样的IP。  自己本地用localhost访问的话,ip是127.0.0.1
      

  5.   

    http://training.tsinghua.edu.cn/html/jishuyuandi/2009/0302/48.html
    这篇文章适合你,看看吧。
      

  6.   


        ipAddress = request.getRemoteAddr();
        ipAddress = request.getHeader("x-forwarded-for");
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
        }
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }    //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
            if(ipAddress.indexOf(",")>0){
                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
            }
        }