获取本地ip,java获取域名的ip
几个月前,微信微信官方账号就推出了IP归属地的功能,后续知乎、Tik Tok等平台也陆续增加了这一功能。如果国内用户精确到省份,国外用户精确到国家。本文使用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-forwarded-for );
if(IP==null IP . length()==0 unknown 。equalsIgnoreCase(ip)) {
IP=request . get header( Proxy-Client-IP );
}
if(IP==null IP . length()==0 unknown 。equalsIgnoreCase(ip)) {
IP=request . get header( WL-代理-客户端-IP );
}
if(IP==null IP . length()==0 unknown 。equalsIgnoreCase(ip)) {
IP=request . get header( HTTP _ CLIENT _ IP );
}
if(IP==null IP . length()==0 unknown 。equalsIgnoreCase(ip)) {
IP=request . get header( HTTP _ X _ FORWARDED _ FOR );
}
if(IP==null IP . length()==0 unknown 。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地址。
Ngx反向代理问题:直接访问公网服务器地址可以成功获取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接口,可能会出现服务挂起,或者服务地址不提供服务等问题。然而,使用本地地址库没有这些问题。
本文采用离线互联网协议(Internet Protocol)地址定位库ip2区域,ip2区域是一个离线互联网协议(Internet Protocol)地址定位库,微秒的查询时间:
首先找到在gihub官网找到地址库ip2region.xdb,具体路径为data/ip2region.xdb:
将ip2region.xdb放在项目的资源目录下:
引入玛文依赖:
属国
groupId org.lionsoul /groupId
artifactId ip2region /artifactId
版本2 .6 .5/版本
/依赖关系获取归属地:
私人搜索者;
@覆盖
公共字符串getIpAddress(字符串ip){
如果( 127.0.0.1 )。等于(IP) IP。以( 192.168 ){
返回局域网IP ;
}
if (searcher==null) {
尝试{
文件文件=资源效用。getfile(类路径:ipdb/IP 2区域。xdb’);
string dbPath=file。getpath();
搜索者=搜索者。newwithfileonly(dbPath);
} catch(找不到文件异常e){
e。printstacktrace();
} catch (IOException e) {
e。printstacktrace();
}
}
字符串区域=空
字符串错误消息=空
尝试{
区域=搜索者。搜索(IP);
} catch(异常e) {
错误消息=e . getmessage();
if (errorMessage!=空错误消息。长度()256){
错误消息=错误消息。子串(0,256);
}
e。printstacktrace();
}
//输出地区
}获取区域就能获取到互联网协议(Internet Protocol)归属地了。例如中国0广东省广州市电信。
小程序效果展示根据上面的程序,做了一个小程序展示归属地。
页面效果图:
扫一扫,就能获取查到自己的归属地了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。