获取本地ip,java获取域名的ip

  获取本地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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: