java获取客户端IP地址和MAC地址

最近项目中要获得客户端的mac地址。服务端是移植的centos系统,arm架构的盒子。客户端是手机和移动设备。(其它场景应该也是类似的)

首先要获得ip地址:

根据客户端的http请求,利用request.getRemoteAddr()获取客户端Ip地址。在局域网内getRemoteAddr()和getRemoteHost()获得的结果相同。request.getRemoteAddr()是获得客户端的ip地址 。getRemoteHost()是获得客户端的主机名 。在有些场景中,可能有Squid等反向代理软件就不能获取到客户端的真实IP地址了。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.letu.com/index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://159.226.94.32/index.jsp
,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的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;
	}

获取mac地址:

ARP命令用于显示和修改“地址解析协议(ARP)”缓存中的项目。ARP缓存中包含一个或多个表,它们用于存储IP地址及其经过解析的以太网或令牌环物理地址。计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。如果在没有参数的情况下使用,则ARP命令将显示帮助信息。只有当TCP/IP协议在网络连接中安装为网络适配器属性的组件时,该命令才可用。另外netstat命令常常和ARP配合使用。netstat命令可以让用户得知目前都有哪些网络连接正在运作,能够显示网络连接、路由表和网络接口信息。arp命令主要作用是显示和修改“地址解析协议
(ARP)”缓存 中的项目。 ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的物理地址(MAC地址)。  计算机上安装的每一个网卡都有自己单独的表。 如果在没有参数的情况下使用,则 arp 命令将显示帮助信息。

我们用ARP -n 列出详细信息。

[[email protected] bin]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
159.226.94.126           ether   A4:56:30:D3:5D:43   C                     eth0

获取mac的java 代码:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class MACAddress {
    String ip;
    String mac;
    public MACAddress (String ip){
        this.ip = ip;
    }
    public MACAddress (){
        this.ip = "0.0.0.0";
    }
    public String getMac(){
        try {
	    Process p = Runtime.getRuntime().exec("arp -n");
            InputStreamReader ir = new InputStreamReader(p.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
			p.waitFor();
            boolean flag = true;
			String ipStr = "(" + this.ip + ")";
            while(flag) {
                String str = input.readLine();
                if (str != null) {
					if (str.indexOf(ipStr) > 1) {
                        int temp = str.indexOf("at");
                        this.mac = str.substring(
                        temp + 3, temp + 20);
                        break;
                    }
                } else
                flag = false;
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace(System.out);
        }
        return this.mac;
    }
    public void setIp(String ip){
        this.ip = ip;
    }

}

参考文档:http://blog.sina.com.cn/s/blog_6c87374b01019nwk.html

java获取客户端IP地址和MAC地址

时间: 2024-12-09 10:51:30

java获取客户端IP地址和MAC地址的相关文章

java获取客户端IP和服务器IP

一.Java获取服务器IP(转自:https://www.cnblogs.com/george93/p/6306579.html) //方法一,也是最简单的一种. String SERVER_IP = InetAddress.getLocalHost().getHostAdress().toString(); //方法二: /** * 获取服务器IP地址 * @return */ @SuppressWarnings("unchecked") public static String g

Java获取客户端IP

在开发工作中,我们常常需要获取客户端的IP.一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. 原因:由于在客户端和服务之间增加了中间代理,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端. 现在图示代理上网和IP的关系: 第一种情况:不通过代理上网,服务器端拿到真实IP 第二种情况:通过代理服务器如:Nginx,Squid等一层代理或多层

java获取客户端ip地址

public static String getIpAddr(HttpServletRequest request) { String ipAddress = null; ipAddress = request.getHeader("x-forwarded-for"); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddr

获取客户端的ip地址与mac地址总结

最近刚完成的一个模块中,需要获取系统客户端的IP地址与物理地址(MAC地址). 1. 获取的本机IP与MAC是服务器的,而非客户端的→_→ 通过JAVA获取,本机的IP地址与MAC地址,使用如下代码即可完成: package com.howin.util; import java.net.*; public class Ipconfig { public static void main(String[] args) throws Exception { // TODO Auto-generat

JS获取客户端IP地址、MAC和主机名的7个方法汇总

一.使用JS获取客户端IP的几个方法 方法一(只针对IE且客户端的IE允许AcitiveX运行,通过平台:XP,SERVER03,2000). 获取客户端IP代码: 1 function GetLocalIPAddr() { 2 var oSetting = null; 3 var ip = null; 4 try { 5 oSetting = new ActiveXObject("rcbdyctl.Setting"); 6 ip = oSetting.GetIPAddress; 7

JS获取客户端IP地址、MAC和主机名七种方法

一.使用JS获取客户端IP的几个方法方法一(只针对IE且客户端的IE允许AcitiveX运行,通过平台:XP,SERVER03,2000).获取客户端IP代码:<HTML><HEAD><TITLE>GetLocalIP</TITLE></HEAD><BODY>获取IP:<script language="JavaScript"> function GetLocalIPAddr(){ var oSetti

java获取客户端请求ip地址

public static String getIpAddr(HttpServletRequest request) { if (null == request) { return null; } String proxs[] = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWAR

java获取客户端登陆地址信息(国家、省份、城市等)

原文:java获取客户端登陆地址信息(国家.省份.城市等) 源代码下载地址:http://www.zuidaima.com/share/1550463687658496.htm /** * @param urlStr * 请求的地址 * @param content * @author www.zuidaima.com * 请求的参数 格式为:name=xxx&pwd=xxx * @param encoding * 服务器端请求编码.如GBK,UTF-8等 * @return */ privat

c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存

我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统名称.物理内存. 首先需要引入命名空间: using System.Management; /// 操作系统的登录用户名: string GetUserName() { try { string st = ""; ManagementClass mc = new ManagementCla