Java 获取IP工具类、Vo类整理记录
前言
日常开发中,获取ip是常用的功能,本文记录如何在Java中获取本机外网ip、地理位置,访问用户的外网ip、地理位置,以及指定外网ip的地理位置;
代码编写
1、获取访问用户外网ip,我们从访问者的HttpServletRequest中获取(注:要外网访问才能获取到外网地址,如果你在局域网甚至本机上访问,获得的是内网或者本机的ip)
2、获取本机外网ip、地理位置以及指定外网ip的地理位置,我们调用太平洋网络IP地址查询Web接口(http://whois.pconline.com.cn/),返回ip、地理位置
太平洋网络IP地址查询接口丰富,参数设置多样齐全,总有一款适合我们的需求

我们使用的就是第二个返回json(http://whois.pconline.com.cn/ipJson.jsp?json=true),如果要查询指定ip,就拼上&ip=
Vo类
根据接口返回的数据,封装IpVo类,以方便接参转换实体
//太平洋接口返回数据格式
/*
{
ip: "58.63.47.115",
pro: "广东省",
proCode: "440000",
city: "广州市",
cityCode: "440100",
region: "天河区",
regionCode: "440106",
addr: "广东省广州市天河区 电信",
regionNames: "",
err: ""
}
*/
IpVo.java
import lombok.Data; /**
* ip
*/
@Data
public class IpVo {
private String ip;//IP地址
private String pro;//省
private String proCode;//省编码
private String city;//城市
private String cityCode;//城市编码
private String region;//区
private String regionCode;//区编码
private String addr;//详细地址 + 运营商 //主要用于接参,无实际意义
private String regionNames;
private String err;
}
工具类
封装工具类
import cn.huanzi.qch.baseadmin.common.pojo.IpVo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat; /**
* IP工具类
*/
@Slf4j
public class IpUtil {
/**
* 获取访问者的ip地址
* 注:要外网访问才能获取到外网地址,如果你在局域网甚至本机上访问,获得的是内网或者本机的ip
*/
public static String getIpAddr(HttpServletRequest request) {
String ipAddress = null;
try {
//X-Forwarded-For:Squid 服务代理
String ipAddresses = request.getHeader("X-Forwarded-For"); if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//Proxy-Client-IP:apache 服务代理
ipAddresses = request.getHeader("Proxy-Client-IP");
} if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//WL-Proxy-Client-IP:weblogic 服务代理
ipAddresses = request.getHeader("WL-Proxy-Client-IP");
} if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//HTTP_CLIENT_IP:有些代理服务器
ipAddresses = request.getHeader("HTTP_CLIENT_IP");
} if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//X-Real-IP:nginx服务代理
ipAddresses = request.getHeader("X-Real-IP");
} //有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
if (ipAddresses != null && ipAddresses.length() != 0) {
ipAddress = ipAddresses.split(",")[0];
} //还是不能获取到,最后再通过request.getRemoteAddr();获取
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
ipAddress = request.getRemoteAddr();
}
} catch (Exception e) {
ipAddress = "";
}
return ipAddress;
} /**
* 调用太平洋网络IP地址查询Web接口(http://whois.pconline.com.cn/),返回ip、地理位置
*/
public static IpVo getIpVo(String ip){
//查本机
String url = "http://whois.pconline.com.cn/ipJson.jsp?json=true"; //查指定ip
if(!StringUtils.isEmpty(ip)){
url = "http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=" + ip;
} StringBuilder inputLine = new StringBuilder();
String read;
try {
HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
urlConnection.setRequestProperty("Charset", "GBK");
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "GBK"));
while ((read = in.readLine()) != null) {
inputLine.append(read);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
} //返回格式
/*
{
ip: "58.63.47.115",
pro: "广东省",
proCode: "440000",
city: "广州市",
cityCode: "440100",
region: "天河区",
regionCode: "440106",
addr: "广东省广州市天河区 电信",
regionNames: "",
err: ""
}
*/ IpVo ipVo = null;
try {
ObjectMapper mapper = new ObjectMapper();
//当属性的值为空(null或者"")时,不进行序列化,可以减少数据传输
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
//设置日期格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//转换成IpVo
ipVo = mapper.readValue(new String(inputLine.toString().getBytes("GBK"), "GBK"), IpVo.class);
} catch (IOException e) {
e.printStackTrace();
}
return ipVo;
} /**
* 直接根据访问者的Request,返回ip、地理位置
*/
public static IpVo getIpVoByRequest(HttpServletRequest request){
return IpUtil.getIpVo(IpUtil.getIpAddr(request));
} /*
终极大法:java获取不了,就用js来获取
<!-- js获取客户ip -->
<script src="http://whois.pconline.com.cn/ipJson.jsp"></script>
*/ /*//测试
public static void main(String[] args) {
//获取本机ip
System.out.println(getIpVo(null)); //获取指定ip
System.out.println(getIpVo("115.48.58.106"));
}*/
}
效果演示
放开注释,运行main方法
//测试
public static void main(String[] args) {
//获取本机ip
System.out.println(getIpVo(null)); //获取指定ip
System.out.println(getIpVo("115.48.58.106"));
}

后记
ip获取暂时记录到这,后续再进行补充
代码开源
注:数据库文件在resources/static/sql目录下面
代码已经开源、托管到我的GitHub、码云:
GitHub:https://github.com/huanzi-qch/base-admin
码云:https://gitee.com/huanzi-qch/base-admin
Java 获取IP工具类、Vo类整理记录的更多相关文章
- 系统获取 IP 工具类
系统获取 IP 工具类 import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterf ...
- Java获取ip地址的几种方法
以下内容介绍下java获取ip地址的几种思路. 1.直接利用java.net.InetAddress类获取,不过这种方法只在windows环境下有效,在linux环境下只能获取localhost地址( ...
- java获取IP地址
最近在一个多系统集成的项目中,由于跳转路径含IP地址,每次IP改了重启项目都得改好多地方,甚是麻烦.刚在网上了解到java获取IP地址,给大家分享下: 首先要导入jar包 request.getRem ...
- Java 获取 IP
/** * 获取访问者IP. * 在一般情况下使用 Request.getRemoteAddr() 即可,但是经过 nginx 等反向代理软件后,这个方法会失效. */ private String ...
- 手把手教你用Java获取IP归属地
前几个月微信公众号上线了IP归属地的功能,后续知乎.抖音等平台纷纷添加了该功能.如果是国内的用户精确到省份,国外用户精确到国家.本文就使用Java实现获取IP归属地. ! 主要讲解几个步骤: Java ...
- Java获取IP地址,IpUtils工具类,Java IP地址获取
================================ ©Copyright 蕃薯耀 2020-01-17 https://www.cnblogs.com/fanshuyao/ import ...
- java 获取ip地址和网络接口
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java获取Ip发送邮件
import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.servlet. ...
- MAC地址,使用java获取IP地址和MAC地址。
MAC地址,通常在http连接的项目中,来区分唯一客户端. MAC:六组十六进制字符组成. 如:E0-3F-49-AB-DB-EB IP:四组八位的二进制字符组成. 如:10.6.62.244 /** ...
随机推荐
- python-CSV格式清洗与转换、CSV格式列变换、CSV格式数据清洗【数据读入的三种方法】【strip、replace、split、join函数的使用】
1)CSV格式清洗与转换 描述 附件是一个CSV格式文件,提取数据进行如下格式转换: (1)按行进行倒序排列: (2)每行数据倒序排 ...
- 字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 目录 @ 目录 目录 一.前言 二.开发环境 三.案例目标 四.技术实现 五.测试结果 1. ...
- Node教程——封装一个token验证器
重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...
- 【hdu5100】棋盘覆盖
http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目大意: 用1*k的木块铺n*n的棋盘,求多铺满多少个单位格. 方法: n < k,显然无解:n ...
- flink入门学习
Flink学习笔记 一.简介 1.定义: 针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.. 2.应用场景: 流数据:把所有任务当成流来处理,处理观察和分析连续事件产生的数 ...
- 线程和Python—Python多线程编程
线程和Python 本节主要记录如何在 Python 中使用线程,其中包括全局解释器锁对线程的限制和对应的学习脚本. 全局解释器锁 Python 代码的执行是由 Python 虚拟机(又叫解释器主循环 ...
- Java代码生成器多表配置优化,增加自定义实体功能
目录 前言 多表配置优化 自定义实体 杂谈 结语 前言 最近利用零碎的时间对代码生成器做了进一步更新:优化多表配置模块,增加自定义实体功能,美化单表和多表配置的UI界面,修复用户反馈的若干bug, ...
- 👋嗨,你有一份微信好友报告待查收~
全部代码都已上传至我的KLab-
- vtk学习记录(三)——初识vtkRenderer
目录 前言 vtkRenderer 引入vtk窗口 小结 前言 一场疫情打乱了好多人的节奏,我也一样,一不留神半年都快过去了,这期间虽说一直在鼓捣东西吧,不过确实是没啥实质性的进展,索性就继续把vtk ...
- php_rce
0x01 PHP_RCE RCE(remote command/code execute):远程命令/代码执行 此题为ThinkPHP V5远程代码执行漏洞 0x02 命令执行 http://124. ...