springboot查看请求ip、ip归属地、设备信息、操作系统信息

1、在pom添加依赖

    <dependency><groupId>eu.bitwalker</groupId><artifactId>UserAgentUtils</artifactId><version>1.21</version></dependency>

2、请求信息工具类

package com.mb.framework.web.utils;import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import eu.bitwalker.useragentutils.UserAgent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;
import java.net.*;
import java.util.Enumeration;@Slf4j
public class IpUtil {private static final String LOCAL_IP = "127.0.0.1";/*** 获取IP地址** 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址*/public static String getIpAddr(HttpServletRequest request) {if (request == null) {return "unknown";}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("X-Forwarded-For");}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.getHeader("X-Real-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return "0:0:0:0:0:0:0:1".equals(ip) ? LOCAL_IP : ip;}/*** 根据ip获取归属地* @param ip* @return*/public static String getAddress(String ip) {// IP地址查询final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp?ip="+ip;// 未知地址final String UNKNOWN = "未知";// 内网不查询if (internalIp(ip)) {return "内网";}try {String rspStr = HttpUtil.get(IP_URL);if (StringUtils.isEmpty(rspStr)) {log.error("获取地理位置异常 {}", ip);return UNKNOWN;}String substring = rspStr.substring(rspStr.lastIndexOf("{"), rspStr.indexOf("}")+1);JSONObject jsonObject = JSON.parseObject(substring);String addr = jsonObject.getString("addr");return addr;} catch (Exception e) {log.error("获取地理位置异常 {}", ip);}return UNKNOWN;}public static void main(String[] args) throws Exception {InetAddress ia = null;try {ia = InetAddress.getLocalHost();String localname = ia.getHostName();String localip = ia.getHostAddress();System.out.println("本机名称是:" + localname);System.out.println("本机的ip是 :" + localip);} catch (Exception e) {e.printStackTrace();}InetAddress ia1 = InetAddress.getLocalHost();// 获取本地IP对象System.out.println("本机的MAC是 :" + getMACAddress(ia1));}// 获取MAC地址的方法private static String getMACAddress(InetAddress ia) throws Exception {// 获得网络接口对象(即网卡),并得到mac地址,mac地址存在于一个byte数组中。byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();// 下面代码是把mac地址拼装成StringStringBuffer sb = new StringBuffer();for (int i = 0; i < mac.length; i++) {if (i != 0) {sb.append("-");}// mac[i] & 0xFF 是为了把byte转化为正整数String s = Integer.toHexString(mac[i] & 0xFF);// System.out.println("--------------");// System.err.println(s);sb.append(s.length() == 1 ? 0 + s : s);}// 把字符串所有小写字母改为大写成为正规的mac地址并返回return sb.toString().toUpperCase();}/*** 查看是否内部ip* @param ip* @return*/public static boolean internalIp(String ip) {boolean res = false;byte[] addr = textToNumericFormatV4(ip);if (addr != null && ip != null) {res = internalIp(addr) || LOCAL_IP.equals(ip);}return res;}private static boolean internalIp(byte[] addr) {final byte b0 = addr[0];final byte b1 = addr[1];// 10.x.x.x/8final byte SECTION_1 = 0x0A;// 172.16.x.x/12final byte SECTION_2 = (byte) 0xAC;final byte SECTION_3 = (byte) 0x10;final byte SECTION_4 = (byte) 0x1F;// 192.168.x.x/16final byte SECTION_5 = (byte) 0xC0;final byte SECTION_6 = (byte) 0xA8;boolean flag = false;switch (b0) {case SECTION_1:flag = true;break;case SECTION_2:if (b1 >= SECTION_3 && b1 <= SECTION_4) {flag = true;}break;case SECTION_5:if (b1 == SECTION_6) {flag = true;}break;default:break;}return flag;}/*** 将IPv4地址转换成字节*IPv4地址* @param text* @return byte 字节*/public static byte[] textToNumericFormatV4(String text) {if (text.length() == 0) {return null;}byte[] bytes = new byte[4];String[] elements = text.split("\\.", -1);try {long l;int i;switch (elements.length) {case 1:l = Long.parseLong(elements[0]);if ((l < 0L) || (l > 4294967295L)) {return null;}bytes[0] = (byte) (int) (l >> 24 & 0xFF);bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);bytes[3] = (byte) (int) (l & 0xFF);break;case 2:l = Integer.parseInt(elements[0]);if ((l < 0L) || (l > 255L)) {return null;}bytes[0] = (byte) (int) (l & 0xFF);l = Integer.parseInt(elements[1]);if ((l < 0L) || (l > 16777215L)) {return null;}bytes[1] = (byte) (int) (l >> 16 & 0xFF);bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);bytes[3] = (byte) (int) (l & 0xFF);break;case 3:for (i = 0; i < 2; ++i) {l = Integer.parseInt(elements[i]);if ((l < 0L) || (l > 255L)) {return null;}bytes[i] = (byte) (int) (l & 0xFF);}l = Integer.parseInt(elements[2]);if ((l < 0L) || (l > 65535L)) {return null;}bytes[2] = (byte) (int) (l >> 8 & 0xFF);bytes[3] = (byte) (int) (l & 0xFF);break;case 4:for (i = 0; i < 4; ++i) {l = Integer.parseInt(elements[i]);if ((l < 0L) || (l > 255L)) {return null;}bytes[i] = (byte) (int) (l & 0xFF);}break;default:return null;}} catch (NumberFormatException e) {log.error("数字格式化异常",e);return null;}return bytes;}/*** 获取本地ip* @return*/public static String getLocalIP() {String ip = "";if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {InetAddress addr;try {addr = InetAddress.getLocalHost();ip = addr.getHostAddress();} catch (UnknownHostException e) {log.error("获取失败",e);}return ip;} else {try {Enumeration<?> e1 = (Enumeration<?>) NetworkInterface.getNetworkInterfaces();while (e1.hasMoreElements()) {NetworkInterface ni = (NetworkInterface) e1.nextElement();if (!ni.getName().equals("eth0")) {continue;} else {Enumeration<?> e2 = ni.getInetAddresses();while (e2.hasMoreElements()) {InetAddress ia = (InetAddress) e2.nextElement();if (ia instanceof Inet6Address) {continue;}ip = ia.getHostAddress();return ip;}break;}}} catch (SocketException e) {log.error("获取失败",e);}}return "";}public static ClientMsg getRequestMsg(HttpServletRequest request) {UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("user-agent"));ClientMsg ipVo =  new ClientMsg();//客户端类型  手机、电脑、平板String clientType = userAgent.getOperatingSystem().getDeviceType().toString();ipVo.setClientType(clientType);//操作系统类型String os = userAgent.getOperatingSystem().getName();ipVo.setSystemType(os);//请求ip/*  String ip = getIpAddr(request);ipVo.setIp(ip);*///浏览器类型String browser = userAgent.getBrowser().toString();ipVo.setBrowserType(browser);return ipVo;}
}

springboot查看请求ip、ip归属地、设备信息、本地MAC地址、操作系统信息相关推荐

  1. 友盟统计使用及添加测试设备(设备ID及Mac地址识别)

    友盟统计新增用户,日活,抓bug日志 注册账号并申请Appkey 拿到自己App的Appkey之后,Manifest中检查以下权限,没有则添加 <uses-permission android: ...

  2. ios imei android,获取手机(ios,android)的设备唯一码(mac地址, IMEI)

    获取手机(ios,android)的设备唯一码(mac地址, IMEI) app中总会用到客户端下载量数据统计,一般都是用的设备的唯一码作为标示,以下是获取mac地址的代码片段,记录备份. andro ...

  3. 超薄本在未连接网线怎么查看本地mac地址

    正常的情况下我们查看mac地址的时候,直接在win+R,输入cmd,调出操作窗口输入ipconfig/all命令就行了.但是我们在未插入转接头的时候,是查看不到本地mac地址的,只有无线网和虚拟的ma ...

  4. springboot 获取访问者的ip地址、访问设备信息、城市地址信息

    1.获取访问者的ip地址: 不多说直接上代码,详解见注释 package com.xr.util;import lombok.extern.slf4j.Slf4j;import javax.servl ...

  5. 解决同一个局域网两个DHCP冲突问题--涉及到局域网IP扫描,主机操作系统扫描,mac地址查询

    最近这几天我们大优能公司的网络(网段为10.0.0.1/24)总是出问题,常有一部分机器获取到192.168.1.0/24网段的IP和DNS,这部分机器无法上网且邮箱均不能用.公司同事囧的不成样子,不 ...

  6. 比特,比特流,IP,子网掩码,子网划分,MAC地址

    课程内容回顾: OSI 产生背景 作用 实现过程 7层 每层的功能 每层实现协议 每层物理设备 数据转发流程:1.发包(数据封装) 2.传包(网络)3.收包(数据解封装)学习思路:OSI--1-7网络 ...

  7. 华为路由器怎么查看设备本身的MAC地址

    华为路由器的 MAC 地址可以在管理界面中查看.具体步骤如下: 打开浏览器,输入路由器的 IP 地址,默认为 192.168.1.1 输入用户名和密码,进入路由器管理界面 在菜单栏中找到 " ...

  8. Python获取本地mac地址、主机名、IP地址

    1 在windows系统,命令行输入 ipconfig /all 此处获得mac地址. 2 在Python中获取mac地址 import uuid mac = uuid.UUID( int=uuid. ...

  9. python通过onvif协议搜索局域网所有摄像头ip,并获取摄像头rtsp,mac地址等相关服务

    这里用到camera_discovery模块 pip install camera_discovery from camera_discovery import CameraDiscovery cam ...

最新文章

  1. ASP.Net中利用CSS实现多界面两法
  2. 为什么说,我们可能是宇宙中唯一的智慧生命?
  3. IOS 获取缓存目录文件大小并清除
  4. 分享几个路由器设置小技巧,总有用得到的一天!
  5. mysql505复位密码_mysql5 如何复位根用户密码[官方文档]
  6. C#调用Python模块
  7. java某个参数值设置为空_@PathVariable为空时指定默认值的操作
  8. nodemcu引脚_一、ESP32开发板NodeMCU-32S简介
  9. java 区间api_Java 常用API(一)
  10. 第十三届蓝桥杯省赛Java-B组
  11. mysql基于PHP的校园竞赛信息网站 毕业设计源码221230
  12. java去除水印,Java 删除/复制Word文档水印
  13. “开源和商业化不能形成对立!”
  14. sed -n使用变量
  15. Postman的下载及安装
  16. 中泰证券钢铁行业数据库
  17. 查找计算机里包含相关文字,windows7如何搜索包含关键字的文件_win7电脑文件怎么查关键字文件...
  18. 开工大吉,开启新征程!
  19. 2019年AI领域回顾:稳定发展还是幻想破灭?
  20. python3基础(廖雪峰)

热门文章

  1. 手撸一个网页版看板(仿照板栗看板样式)
  2. html如何自动写重复的语句【实测成功】
  3. 数据挖掘公开数据集【汇总】
  4. 《HBase 不睡觉》第一章 - 初识 HBase
  5. 汉语自动分词研究评述
  6. 空客为重庆四条地铁线路部署TETRA系统 助力实施跨线运营
  7. 飞控与地面站的概念和关系
  8. 算法研究和学习-果蝇算法FOA
  9. 赵小楼《天道》《遥远的救世主》深度解析(83)形式主义的典范,辩证逻辑的障碍
  10. 3d wallpaper android,3D Parallax Wallpaper