获取外网IP,再根据IP定位城市

根据ip定位城市对外开放的接口,有些接口不能直接用了,比如说淘宝接口。这里我用的是一个不知名的接口。

1.AddressUtil工具类
package cn.ztjz.module.audit.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * <p>
 * 获取ip,定位城市工具类
 * <p>
 *
 * @className: AddressUtil
 * @author: 
 * @create: 2021-06-25 11:55
 */
public class AddressUtil {
   


    /**
     * @param ip
     * @MethodName: getAddress
     * @Description: 根据ip定位城市
     * @return: java.lang.String
     * @Author: 
     * @Date: 2021/6/25 12:04
     **/
    public static String getAddress(String ip) {
   
        //获取城市得接口
        String url = "http://ip.ws.126.net/ipquery?ip" + ip;

        String str = HttpUtil.get(url);

        if (!StrUtil.hasBlank(str)) {
   

            String substring = str.substring(str.indexOf("{"), str.indexOf("}") + 1);

            cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(substring);

            String city = jsonObject.getStr("city");

            return city;
        }
        return null;
    }

   /**
    * @MethodName: address
    * @Description: 解析地址
    * @param address: 详细地址
    * @return: java.lang.String
    * @Author: 
    * @Date: 2021/6/29 9:50
    **/
    public static String address(String address) {
   
        String regex = "(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)?(?<village>.*)";
        Matcher m = Pattern.compile(regex).matcher(address);
        String city = null;
        if (m.find()) {
   
            city = m.group("city");
        }
        return city;
    }


    /**
     * @param rd
     * @MethodName: readAll
     * @Description: 将输入流转换成字符串
     * @return: java.lang.String
     * @Author: 
     * @Date: 2021/6/25 12:28
     **/
    private static String readAll(Reader rd) throws IOException {
   
        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要获取外网IP地址,可以使用Spring的RestTemplate来发送HTTP请求获取公共IP地址。 首先,你需要创建一个Spring的配置文件,例如application.properties,添加以下配置项: ```properties publicIp.url=http://ifconfig.me/ip ``` 然后,创建一个服务类IpAddressService,使用RestTemplate发送GET请求: ```java @Service public class IpAddressService { @Autowired private RestTemplate restTemplate; @Value("${publicIp.url}") private String publicIpUrl; public String getPublicIpAddress() { return restTemplate.getForObject(publicIpUrl, String.class); } } ``` 在主类中注入该服务类: ```java @SpringBootApplication public class MyApp { @Autowired private IpAddressService ipAddressService; public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @PostConstruct public void printPublicIpAddress() { String publicIpAddress = ipAddressService.getPublicIpAddress(); System.out.println("Public IP address: " + publicIpAddress); } } ``` 在应用启动后,调用`getPublicIpAddress()`方法即可获取外网IP地址并打印出来。这里使用的是`http://ifconfig.me/ip`这个公共服务来获取IP地址,你也可以使用其他类似的服务。 ### 回答2: 在 Spring 中获取外网 IP 地址可以通过以下步骤实现: 1. 导入相关依赖: 在 Maven 或 Gradle 配置文件中引入 Apache HttpClient 或 OkHttpHTTP 请求库的依赖。 2. 创建一个 HTTP 请求: 使用上述库中的类创建一个 HTTP 请求,指定要请求的外部服务地址。可以选择发送 GET 或 POST 请求,根据具体需求来决定。 3. 发送请求并获取结果: 调用发送请求的方法,并将响应结果保存到一个变量中。 4. 解析响应结果: 对于获取外网 IP 的请求,响应结果通常是一个包含外网 IP 地址的字符串。使用正则表达式或其他方式从结果中提取 IP 地址。 5. 处理和使用 IP 地址: 将获取到的 IP 地址存储到一个变量中,然后可以进行后续的处理或使用。例如,将获取到的 IP 地址保存到数据库或发送到前端页面供用户查看等。 需要注意的是,上述方法获取的是服务端视角下的外网 IP,即应用程序所在服务器的公网 IP。如果需要获取客户端机器的公网 IP,那么由于 HTTP 请求是从客户端发出的,需要在服务器端记录客户端请求的 IP 地址,并从服务器端返回给客户端获取。 ### 回答3: 在Spring中获取外网IP地址有多种方式。下面介绍两种常见的方式: 1. 使用第三方接口:可以通过访问一个提供外网IP的第三方接口来获取。你可以使用Spring提供的`RestTemplate`来发送HTTP请求并解析返回的JSON数据。示例代码如下: ```java import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; public String getPublicIPAddress() { RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> response = restTemplate.getForEntity("https://api.ipify.org?format=json", String.class); // 解析返回的JSON获取IP地址 // 代码略 // 返回IP地址 // return ipAddress; } ``` 2. 使用Java的网络工具:可以使用Java的`InetAddress`类来获取本机所在局域网的IP地址,再通过网络工具来获取公网IP地址。示例代码如下: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.URL; public String getPublicIPAddress() throws IOException { // 获取局域网IP地址 String localIpAddress = InetAddress.getLocalHost().getHostAddress(); // 获取公网IP地址 URL ipUrl = new URL("http://checkip.amazonaws.com"); BufferedReader reader = new BufferedReader(new InputStreamReader(ipUrl.openStream())); String publicIpAddress = reader.readLine(); // 返回公网IP地址 // return publicIpAddress; } ``` 以上两种方式都可以在Spring的服务中使用,根据需求选择其中一种即可。最后,别忘记处理异常和添加必要的异常处理机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值