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 /** ...
随机推荐
- Ngxin 开启CDN 日志获取不了真实IP的解决办法。
nginx配置里面在http{ 后加入如下两行代码即可: set_real_ip_from 0.0.0.0/0;real_ip_header X-Forwarded-For; 重启nginx生效. 注 ...
- C语言基础知识总结
知识点的回忆与巩固 一. 条件分支结构 1.if分支语句 2.switch语句 二.循环体部分知识点整理 1.for循环 2.while循环-适合不确定循环次数时使用 三.字符串与数组 数组的操作 1 ...
- JAVA大数--POJ 1715 大菲波数
Problem Description Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n>=3. 计算第n项Fibonacci数值. Inp ...
- P4720【模板】扩展卢卡斯,P2183 礼物
扩展卢卡斯定理 最近光做模板了 想了解卢卡斯定理的去这里,那题也有我的题解 然而这题和卢卡斯定理并没有太大关系(雾 但是,首先要会的是中国剩余定理和exgcd 卢卡斯定理用于求\(n,m\)大,但模数 ...
- 一个简单的wed服务器SHTTPD(8)———— URI分析
//start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...
- nginx判定国家ip访问网站
我们可以通过GeoIP模块和MaxMind免费数据库来实现.MaxMind具有新版本的数据库GeoLite2,它仅支持CSV和mmdb格式.可以支持mngx_http_geoip2_modulemdb ...
- CGI (通用网关接口)
CGI cgi即 Common Gateway Interface 译作 通用网关接口 是应用程序与应用程序之间的输入输出协议.比如我们写信,规定了开头一句写称呼,中间写内容,最后署名和日期.看到这种 ...
- SSM整合案例:图书管理系统
目录 SSM整合案例:图书管理系统 1.搭建数据库环境 2.基本环境搭建 2.1.新建一个Maven项目,起名为:ssmbuild,添加web的支持 2.2.导入pom的相关依赖 2.3.Maven静 ...
- 【Scala】Actor并发编程实现单机版wordCount
文章目录 对单个文本文件进行单词计数 对多个文本文件进行单词计数 对单个文本文件进行单词计数 import scala.actors.Actor import scala.io.Source //读取 ...
- u-boot 源码分析(1) 启动过程分析
u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析 前言 配置 源码结构 api arch board common cmd drivers fs Kbu ...