Java--业务场景:获取请求的ip属地信息

前言

  • 很多时候,项目里需要展示用户的IP属地信息,所以这篇文章就记录一下如何在Java Spring boot项目里获取请求的IP属地。

步骤

  1. 引入依赖:在项目的pom文件中引入下列依赖。
    <!--   该依赖可以根据ip地址获取该ip相关的信息     -->
    <dependency>
       <groupId>net.dreamlu</groupId>
       <artifactId>mica-ip2region</artifactId>
       <version>2.5.6</version>
    </dependency>
    
  2. IpUtil工具类:该工具类对HttpServletRequest请求进行解析,得到ip地址字符串。
    public class IpUtil {
      /**
       * 获取客户端ip
       *
       * @param request
       * @return
       */
       public static String getIp(HttpServletRequest request) {
      	  String ip = request.getHeader("x-forwarded-for");
    	  if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
    	     // 多次反向代理后会有多个ip值,第一个ip才是真实ip
             if (ip.indexOf(",") != -1) {
          	      ip = ip.split(",")[0];
          	 }
      	  }
    	  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        	 ip = request.getHeader("Proxy-Client-IP");
          }
          if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    	     ip = request.getHeader("WL-Proxy-Client-IP");
      	  }
          if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      	     ip = request.getHeader("HTTP_CLIENT_IP");
          }
          if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("HTTP_X_FORWARDED_FOR");
          }
          if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Real-IP");
          }
          if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getRemoteAddr();
          }
          return ip;
        }
    }
    
  3. Controller层接口:在Controller层编写接口,获取请求的IP属地。
    @RestController
    @RequestMapping("/part/util")
    @Api(tags = "工具类", value = "UtilController")
    public class UtilController {
       @Autowired
       private Ip2regionSearcher ip2regionSearcher; // 核心处理类
       
       @ApiOperation(value = "获取ip属地")
       @GetMapping("/ipCity")
       public String getipCity(HttpServletRequest request) {
           String ip = IpUtil.getIp(request);
           IpInfo ipInfo = ip2regionSearcher.memorySearch(ip);
           String city = ipInfo.getCity();
           return city;
       }
    }
    
  4. 测试接口: 这里我的请求是内网ip,所以返回的结果是“内网ip”,有点像废话hhh。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IpInfo类中的方法

  1. 所有方法如下:
    IpInfo

  2. 简单介绍一下几个常见的方法

    ipInfo.getCountry(); // 国家中文名称
    ipInfo.getProvince(); // 中国省份中文名称
    ipInfo.getAddress(); // 详细地址
    ipInfo.getIsp(); // 互联网服务提供商
    ipInfo.isOverseas(); // 是否是国外
    ipInfo.getLat(); // 纬度
    ipInfo.getLng(); // 经度

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
由于获取用户IP地址的方式可能因系统和网络环境而异,因此不能提供简单的Java代码来实现此功能。 其中一种方法是使用第三方API,例如ip-api.com。您可以使用Java的HttpClient类发送GET请求到该网站,然后解析响应内容获取用户的IP地址信息。 代码示例: ``` import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import org.json.JSONObject; public class Example { public static void main(String[] args) throws IOException { String url = "http://ip-api.com/json"; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); JSONObject json = new JSONObject(response.toString()); System.out.println("Your IP: " + json.getString("query")); System.out.println("Your Location: " + json.getString("city") + ", " + json.getString("regionName") + ", " + json.getString("country")); } } ``` 在这个示例中,我们使用了第三方API ip-api.com 获取ip地址信息,使用了Java核心库中的URL、HttpURLConnection、BufferedReader等类发送请求,使用json-simple解析响应内容。 请注意,需要添加json-simple包,详细请参考json-simple官网
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻馅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值