养成习惯,先赞后看!!!

目录

  • 1.前言
  • 2.步骤
    • 2.1设备ip
      • 2.1.1首先创建获取ip地址的工具类IpUtil
      • 2.1.2在controller中测试使用
    • 2.2设备类型
      • 2.2.1导入依赖
      • 2.2.2将Bean注入spring容器之中
      • 2.2.3编写获取设备类型的工具类DeviceUtil
      • 2.2.4在controller中测试

1.前言

相信大家都看到别人写的项目里面都有日志管理这一块,就如下图所示:

可以看到基本上日志这一块都是会显示访问设备的ip地址的,所以自己今天也是尝试了一下,试了一下,发现还是比较简单的,中间也出现了一些小的问题,我也会在下面提到.希望能够对你有帮助.

不说废话,直接上代码

2.步骤

2.1设备ip

2.1.1首先创建获取ip地址的工具类IpUtil

package ams.web.device.util;import lombok.extern.slf4j.Slf4j;
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;}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;}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 "";}
}

2.1.2在controller中测试使用

@GetMapping("/testipaddress")
public String queryAllByHour(HttpServletRequest request) {String ip = IpUtil.getIpAddr(request);return ip;
}

这样我们便能获取到访问接口设备的ip地址了.

为了测试他的真实性,我通过电脑和手机分别访问了一下我的接口,发现的确是能够识别的,如下图所示:

电脑访问接口:

手机访问接口:

数据库中插入的数据:

可以看到这里的确将设备的ip地址读取到了.

有一个 小BUG ,但是大家仔细看时间那一块会发现,好像上面的时间都比最下的一个时间慢了8个小时,这个主要是我们设置的时区有问题,修改application.yaml文件中这两处配置即可解决问题:

 datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://ip地址:3306/数据库?useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf-8#serverTimezone修改成东八区即可
jackson:time-zone: GMT+8

获取到设备的IP地址之后,我又想了想能不能获取到设备类型了,查阅了网上的资料发现,spring已经帮我们集成好了一个插件,我们引用进来,配置一下就可以直接用了,不多说了,spring牛逼.

2.2设备类型

2.2.1导入依赖

<dependency><groupId>org.springframework.mobile</groupId><artifactId>spring-mobile-device</artifactId><version>1.1.3.RELEASE</version>
</dependency>

2.2.2将Bean注入spring容器之中

一般是在你的MVC配置文件添加以下代码

@Bean
public DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() {return new DeviceResolverHandlerInterceptor();
}@Bean
public DeviceHandlerMethodArgumentResolver
deviceHandlerMethodArgumentResolver() {return new DeviceHandlerMethodArgumentResolver();
}@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new DeviceResolverHandlerInterceptor());
}@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(new DeviceHandlerMethodArgumentResolver());
}

2.2.3编写获取设备类型的工具类DeviceUtil

import org.springframework.mobile.device.Device;
public class DeviceUtil {public static String getdevice(Device device){if (device.isMobile()) {System.out.println("========请求来源设备是手机!========");return "手机";} else if (device.isTablet()) {System.out.println("========请求来源设备是平板!========");return "平板";} else if(device.isNormal()){System.out.println("========请求来源设备是PC!========");return "PC";}else {System.out.println("========请求来源设备是其它!========");return "其他";}}
}

2.2.4在controller中测试

@GetMapping("/testdevice")
public String testdevice(Device device) {String name=DeviceUtil.getdevice(device);return name;
}

PC端测试:

手机端测试:

都看到这儿了,如果觉得对你有帮助的话,可以关注我的公众号,新人up需要你的支持!!!

SpringBoot获取访问接口设备的ip地址以及设备类型相关推荐

  1. php取当前是pc还是手机号,PHP 获取访问用户的 IP, 地址 , 访问设备(手机还是PC)并返回手机类型和PC浏览器类型...

    我这个方法比较笨 , 但是有效果 , 百度很多都是有问题的 ,基本都是获取地址的API的问题, 我用的是TP , 所以我是把方法放在common中的 , 然后首页调用, 第一个 , 获取访客IP , ...

  2. TP5 网站获取访问用户的 IP, 地址 , 访问设备(手机还是PC)并返回手机类型和PC浏览器类型

    我这个方法比较笨 , 但是有效果 , 百度很多都是有问题的 ,基本都是获取地址的API的问题, 我用的是TP , 所以我是把方法放在common中的 , 然后首页调用, 第一个 , 获取访客IP , ...

  3. springboot 获取访问接口的请求的IP地址

    工具类: import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.Unkn ...

  4. 5 获取当前访问的控制名称_LabVIEW编程技巧:网络通信中如何获取计算机名称、IP地址等信息...

    问题引出 在网络通讯编程中,经常需要获取当前主机的名称.IP地址等信息,在LabVIEW中如何获取这些信息呢? 下面以本机为例进行说明,先看一下本机的信息.在Windows系统中打开控制台程序,输入& ...

  5. 【Win 10 应用开发】获取本机的IP地址

    按照老规矩,也是朋友的建议,老周今天在吹牛之前,先讲一个小故事. 有朋友问我,老周,你现在还发短信吗,你每个月用多少电话费?唉,实话说,现在真的发短信不多了,套餐送的130条短信,每月都发不了一条.至 ...

  6. request获取mac地址_【Go】获取用户真实的ip地址

    原文链接:https://blog.thinkeridea.com/201903/go/get_client_ip.html 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip ...

  7. 批量获取ip运营商_关于获取运营商的IP地址

    关于获取运营商的IP地址 目前中国国内ISP主要有电信.网通(现已与网通合并).移动(已合并铁通)三家,最大的为电信与联通(网通).由于南方和北方的ISP不同,ISP之间的限制导致南北方用户访各的网站 ...

  8. 获取指定域名的IP地址

    获取指定域名的IP地址 所需函数:gethostbyname 函数原型: struct hostent* gethostbyname(const char *name) 参数:const char * ...

  9. iOS 如何获取手机外网IP地址(附内网IP地址)

    查找了一些方法,最初以为拿到的就是手机对外的公网地址,其实只是本地IP地址.下面把获取手机内外网IP地址的方法总结下: 一.获取手机本地静态IP地址:(局域网) 方法1: 首先导入头文件: //IP地 ...

  10. 获取网页访问者的IP地址

    描述:获取网页访问者的IP地址,并显示出访问时间 原理:使用JSP内置对象request的getRemoteAddr方法获取访问者地址:使用SimpleDateFormat将当前时间转换为指定的时间格 ...

最新文章

  1. JSON入门基础知识
  2. python字典键值可以是元组吗_python元组与字典
  3. 结构(struct)
  4. 主成分分析和因子分析十大不同点
  5. java单例枚举_Java增强枚举的用例
  6. 电脑的虚拟服务器位置,如何配置基于IP地址的虚拟主机
  7. 【渗透测试】SQL注入笔记
  8. 【codevs1830】【BZOJ1951】古代猪文,数论综合
  9. 纠前误码率与信噪比 matlab,信噪比与误码率关系.pdf
  10. 使用Java处理大文件
  11. Qt总结之十九:Qt中控件new之后需不需要delete的问题
  12. [Publish AAR To Maven] 使用GPG对文件进行签名加密
  13. 刷入Magisk通用方法
  14. 中企动力助天正生物争夺破伤风抗毒素全球话语权
  15. 码农枪击了 4 名同事后被警方击毙!后附“程序员保命指南”
  16. 他因“上帝粒子”获诺奖,却火速搬到乡下:它毁了我的生活
  17. 远程控制 - 手机完全控制电脑之TeamViewer
  18. 晏几道 天涯 青砚1989
  19. 进入android刷机模式,手机进入recovery模式怎么刷机?【详细步骤】
  20. visual C+ 6.0的使用安装

热门文章

  1. 百度2017春招笔试真题编程题集合--买帽子
  2. Java源码阅读--任重而道远(lang)
  3. 共享的计算机用户账户限制,win10系统使用共享功能被提示用户账户限制的方案...
  4. 有哪些wordpress企业网站主题推荐?
  5. mysql http_put_洪永佳 - SegmentFault 思否
  6. 语义计算、知识图谱与智能问答(医药常识问答实例)
  7. 学习深度学习过程中的一些经验与方法
  8. html手机号显示错误,手机号码被错误标记有救了 联通开通了查询清除服务
  9. js有关时间换算的一些方法
  10. linux下网速监控 linux及android分网卡网速监控