1.获取访问者的ip地址:

不多说直接上代码,详解见注释

package com.xr.util;import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletRequest;
import java.net.*;
import java.util.Enumeration;/**
*@Author: make mpy
*@Description: 获取IP的方法
*@Date: 2021/1/18 15:02
*/
@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 "";}
}

在控制类里使用:

@RequestMapping("login")
public ResponseResult login( HttpServletRequest request){ResponseResult result=new ResponseResult();String ipAddress = IpUtil.getIpAddr(request);System.out.println(ipAddress);result.getData().put("message",ipAddress);return result;
}

2.获取访问设备信息:    

Spring Mobile是一个框架,该框架提供的功能可以检测向您的Spring网站发出请求的设备的类型,并基于该设备提供其他视图。像所有Spring项目一样,Spring Mobile的真正强大之处在于它的扩展容易程度。

特征

  • 设备解析器抽象,用于移动和平板设备的服务器端检测

  • 网站首选项管理,允许用户指示他或她是否喜欢“正常”,“移动”或“平板电脑”体验

  • 站点切换器,能够根据用户的设备和显示的站点首选项,将用户切换到最适合的网站,无论是手机,平板电脑还是普通网站

  • 设备感知视图管理,用于组织和管理特定设备的不同视图

SpringBoot配置:

1.要使用Spring Mobile,需要在项目的pom.xml里添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mobile</artifactId><version>1.5.9.RELEASE</version>
</dependency>

2.添加以下基于Java的配置以在Spring Web应用程序中启用设备检测:

package com.xr.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver;
import org.springframework.mobile.device.DeviceResolverHandlerInterceptor;
import org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor;
import org.springframework.mobile.device.site.SitePreferenceHandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class MobileConfig implements WebMvcConfigurer {@Beanpublic DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() {return new DeviceResolverHandlerInterceptor();}@Beanpublic DeviceHandlerMethodArgumentResolverdeviceHandlerMethodArgumentResolver() {return new DeviceHandlerMethodArgumentResolver();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new DeviceResolverHandlerInterceptor());}@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(new DeviceHandlerMethodArgumentResolver());}}

2.将Device注入你的控制器:

@RequestMapping("about")
public void about(Device device){if (device.isMobile()) {System.out.println("========请求来源设备是手机!========");} else if (device.isTablet()) {System.out.println("========请求来源设备是平板!========");} else if(device.isNormal()){    System.out.println("========请求来源设备是PC!========");}else {System.out.println("========请求来源设备是其它!========");}
}

3.获取访问ip城市地址信息:    

1、去腾讯位置服务进行开发者注册
       2、通过访问控制台中key管理,申请key


       3、在key设置里设置白名单,否则有key也不能成功调用接口。
              包括域名白名单和授权ip,一般是自己本机和服务器的ip

4、创建查找位置的工具类

package com.xr.util;
import com.alibaba.fastjson.JSONObject;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;public class IpToAddressUtil {//使用腾讯的接口通过ip拿到城市信息private static final String KEY = "自己的key";public static String getCityInfo(String ip)  {String s = sendGet(ip, KEY);Map map = JSONObject.parseObject(s, Map.class);String message = (String) map.get("message");if("query ok".equals(message)){Map result = (Map) map.get("result");Map addressInfo = (Map) result.get("ad_info");String nation = (String) addressInfo.get("nation");String province = (String) addressInfo.get("province");//  String district = (String) addressInfo.get("district");String city = (String) addressInfo.get("city");String address = nation + "-" + province + "-" + city;return address;}else{System.out.println(message);return null;}}//根据在腾讯位置服务上申请的key进行请求操作public static String sendGet(String ip, String key) {String result = "";BufferedReader in = null;try {String urlNameString = "https://apis.map.qq.com/ws/location/v1/ip?ip="+ip+"&key="+key;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段
//            for (Map.Entry entry : map.entrySet()) {
//                System.out.println(key + "--->" + entry);
//            }// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}}

5、在控制类里直接调用就OK

springboot 获取访问者的ip地址、访问设备信息、城市地址信息相关推荐

  1. Java | IP工具类(获取访问者的ip地址 查询IP地址)

    一.IpUtil package com.java.util;import com.fasterxml.jackson.annotation.JsonInclude; import com.faste ...

  2. Java 获取访问者的IP地址

    获取访问者的ip地址 这一次,依然是一个工具类,主要是用来获取当前用户访问服务器的ip地址,可以用于更快的查找出是在那一台电脑上进行操作的那些东西. package com.fashion.fox.c ...

  3. HttpServletRequest、ServerHttpRequest获取访问者真实IP,并设置ip白名单

    在项目记录日志的时候和网关处理IP白名单的时候,通常会获取用户IP,一般都会从HttpServletRequest.ServerHttpRequest获取访问者真实IP 1.从HttpServletR ...

  4. java获取访问者的IP和端口

    目录 Java获取访问者的IP Java 获取访问者端口 Java获取访问者的IP import java.net.InetAddress; import java.net.UnknownHostEx ...

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

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

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

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

  7. 前端页面获取访问者的IP地址、经纬度和地理位置

    目录 前言 前期准备 注册成为开发者,获取Key IP定位和逆地理编码API文档 思路讲解 1.IP地址获取 2.IP定位获取经纬度 3.逆地理编码获取地理位置 代码实现 本地运行版 新版 旧版本(已 ...

  8. oracle实例查询IP,Oracle数据库中获取访问者的IP地址或主机名的方法

    有时我们需要在Oracle数据库中获取访问者的局域网或Internet网的主机名或IP地址.在Oracle中可以使用下面的方法来实现: Oracle包utl_inaddr 作用:用于取得局域网或Int ...

  9. 获取访问者的IP地址

    2019独角兽企业重金招聘Python工程师标准>>> HTTP_X_FORWARDED_FOR:浏览当前页面的用户计算机的网关 如果用户是通过代理服务器浏览的 那么使用REMOTE ...

最新文章

  1. php中常见的错误类型有,JavaScript中常见的错误类型有哪些?(详细介绍)
  2. 基于图机器学习的微生物网络关系预测算法研究
  3. 关于Dialog的简单体验
  4. 18岁学计算机专业好不好,我18岁,学计算机编程,请问有没有什么书或者方法可以提高记忆力的?...
  5. lucene中对不同的域使用不同的分析器
  6. JVM 性能调优监控工具
  7. 2020年11月连云港计算机考试,2019年江苏省连云港市下半年全国计算机等级考试考务通知...
  8. Beta冲刺——day6
  9. [转] crontab命令
  10. 三维绘图辅助设计软件AutoCAD 2023 for Mac
  11. 十大物流仿真软件汇总
  12. 阿拉德之怒手游超详细图文架设教程
  13. 百度坐标拾取html,使用百度批量拾取坐标点-汇总
  14. nginx打开网页报错
  15. 海内外弟子追思百岁国医大师邓铁涛
  16. 古人道中秋 | 制作一个可拖动的月球
  17. 【综述】方面级情感分析 Aspect-level Sentiment Classification
  18. 多飞行机器人吊运系统研究进展及挑战
  19. c语言 英文单词频率统计 哈希存储
  20. 中职双师型教师计算机培训总结,双师型教师计算机培训心得体会.docx

热门文章

  1. 【深度学习】CNN与RNN有什么不同?
  2. 【pwnable.kr】day8:leg
  3. 计蒜客 17115 Coin(2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B)
  4. 免费的java开发工具_Java那些最常用的免费开放工具,分享这15个!
  5. 烟气脱硫技术及工艺流程超全剖析
  6. Linux apr-util安装
  7. 采用路缘石成型机在公路建设中与人工调整两相配合
  8. 模型放到gpu上训练
  9. [内附完整源码和文档] 基于Android网络聊天室的设计与实现
  10. Charles 连接 雷电模拟器(模拟器下载证书)