download:极客工夫 Go 实战训练营全新降级第 5 期 2022 最新完结无密
自学 it666 java python go c
教你如何用 Java 获取 IP 归属。
解释次要步骤:
从 Java 获取申请 IP
解决 Nginx 转发问题
通过 IP 地址获取属性
获取 IP 地址
首先,应用基于 Spring Boot 的我的项目,在控制器中增加 HttpServletRequest 申请参数:
@RestController
公共类 IpController {
@GetMapping(“/ip-address “)
公共字符串 ipAddress(HttpServletRequest 申请){
// 接管申请
}
}
复制代码
通过 HttpServletRequest 获取 IP 地址:
string IP = request . get header(” x-forward-for “);
if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {
ip = request.getHeader(“ 代理 - 客户端 -IP “);
}
if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {
IP = request . get header(” WL- 代理 - 客户端 -IP “);
}
if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {
IP = request . get header(” HTTP CLIENT IP “);
}
if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {
IP = request . get header(” HTTP X FORWARDED _ FOR “);
}
if (ip == null || ip.length() == 0 ||“未知”。equalsIgnoreCase(ip)) {
IP = request . getremoteaddr();
}
回归 IP;
复制代码
调用以获取本地环境中的 IP,0:0:0:0:0:0:0:1 或 LAN IP。
局域网 IP 以 192.168.x.x 结尾,或者是 127.0.0.1 的 IP。
所以须要部署到外网服务器,获取公网地址。部署到外联网服务器能够胜利获取 IP 地址。
Nginx 反向代理问题
间接拜访公网服务器地址能够胜利获取 IP 地址,然而 Nginx 反向代理获取的 IP 地址都是 127.0.0.1。申请客户端 Nginx 服务器反向代理,转发给服务器。此时 IP 反向代理的 IP,也就是 Nginx 服务器的 IP,并不是真正的客户端 IP。
将以下配置增加到 Nginx 的配置文件中的地位模块,以将客户端的 IP 传输到 Nginx 服务:
proxy set header X-Real-IP $ remote _ addr;
proxy set header X-Forwarded-For $ proxy add X Forwarded For;
复制代码
示例:
服务器 {
听 80;
server_name 本地主机;
地位 / {
proxy set header X-Real-IP $ remote _ addr;
proxy set header X-Forwarded-For $ proxy add X Forwarded For;
proxy _ pass http://xxxx;
}
复制代码
以上操作实现后,即可胜利获取 IP。而后通过 IP 取得归属地。
获取 IP 归属
个别应用 IP 获取归属时,会从地址库中找到匹配的地址。本文介绍两种办法。
买通 home API。
您须要发动一个 http 申请。这里,Spring Boot 的 RestTemplate 用于发动一个 http 申请。首先,创立 RestTemplate 的 bean 实例:
@配置
公共类 RestTemplateConfig {
@Bean
公共 RestTemplate restTemplate() {
返回新的 rest template();
}
}
复制代码
而后调用 RestTemplate 发动 http 申请:
公有字符串 URL = ” https://API . Beijing xuetang . com/API/common/IP “;
JSON object JSON object = new JSON object();
jsonObject.put(“ip “,IP);
JSONObject JSON = rest template . postforobject(URL,JSON object,JSON object . class);
if(JSON . getinteger(” code “)= = 0){
JSON = JSON . getjsonobject(” data “);
// 国家
string nation = JSON . getstring(” nation “);
// 省份
String province = json.getString(“ 省 ”);
// 城市
string city = JSON . getstring(” city “);
}
复制代码
下面的 json 是 fastjson 的介绍。
通过地址库。
应用 API 接口,可能会呈现一些问题,如服务已死亡或服务地址不再可用。然而,应用本地地址库没有这些问题。
本文采纳离线 IP 地址地位库 Ip2region。Ip2region 是一个脱机 Ip 地址地位库,查问工夫为微秒级。
介绍 maven 依赖关系:
org.lionsoul
ip2 区域
2.6.5
复制代码
获取归属:
私人搜寻者;
@笼罩
公共字符串 getIpAddress(字符串 ip){
if (“127.0.0.1 “。equals(IP)| | IP . starts with(” 192.168 “){
返回“局域网 IP”;
}
if (searcher == null) {
尝试 {
file file = resource utils . getfile(” class path:ipdb/IP 2 region . xdb “);
string dbPath = file . getpath();
searcher = searcher . newwithfileonly(dbPath);
} catch(file not found exception e){
e . printstacktrace();
} catch (IOException e) {
e . printstacktrace();
}
}
String region = null
String errorMessage = null
尝试{
region = searcher . search(IP);
} catch(异样 e) {
error message = e . getmessage();
if (errorMessage!= null & & error message . length()> 256){
error message = error message . substring(0,256);
}
e . printstacktrace();
}
// 输入区域
}
复制代码
获取区域以获取 IP 地址。