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
复制代码
获取归属:
私人搜索者;
【极客时间Go实战训练营全新升级第5期2022最新完结无密】@覆盖
公共字符串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地址。
推荐阅读
- 极客时间-Go实战训练营全新升级第5期无密
- go里边一个让新手误解,让老炮犯错的小知识点
- 为什么 signal.Notify 使用缓冲通道()
- Go中的网络轮询器(1)--Epoll在Go中的抽象
- net包的使用
- atomic
- 条件变量 Cond
- 类型别名与类型定义的区别
- Go|猿创征文|我的Go成长之路道阻且长