最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot利于第三方服務進行ip定位獲取省份城市

 更新時間:2023年07月23日 14:19:22   作者:化塵成影  
本文主要介紹了Springboot利于第三方服務進行ip定位獲取省份城市,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在web應用的開發(fā)中,我們或許會想知道我們的用戶請求的來源分布情況。本文基于springboot框架,調用百度地圖、高德地圖的開放平臺api,在線對對請求來源的ip進行定位、解析,獲取目標ip所對應的省份、城市、經緯度等信息,方便開發(fā)者將相關數據記錄在操作日志中。

一. 共用部分

統一響應類

/**
 * @author 擺渡人
 * @description 統一響應類
 * @date 2023/7/13 23:26
 */
@Data
@Builder
public class IpAnalyzeResponse {
    /**
     * 狀態(tài)碼
     */
    private String status;
    /**
     * 是否成功
     */
    private Boolean successFlag;
    /**
     * 失敗原因
     */
    private String msg;
    /**
     * 省份名稱
     */
    private String province;
    /**
     * 城市名稱
     */
    private String city;
    /**
     * 經度
     */
    private Double x;
    /**
     * 維度
     */
    private Double y;
}

定義接口

實現該接口,并在配置類中注入接口的實現類,即可拓展ip定位的更多實現方式

/**
 * @author 擺渡人
 * @description ip定位接口
 * @date 2023/7/13 23:25
 */
public interface IPlatFormIpAnalyzeService {
    /**
     * ip定位解析
     * @param ip
     * @return
     */
    IpAnalyzeResponse ipAnalyze(String ip);
}

http請求工具類(用于發(fā)送http請求)

源碼來自SmartAdmin

/**
 * [ HttpUtils ]
 *
 * @author yandanyang
 * @version 1.0
 * @company 1024lab.net
 * @copyright (c) 2019 1024lab.netInc. All rights reserved.
 * @date
 * @since JDK1.8
 */
public class SmartHttpUtil {
    public static String sendGet(String url, Map<String, String> params, Map<String, String> header) throws Exception {
        HttpGet httpGet = null;
        String body = "";
        try {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            List<String> mapList = new ArrayList<>();
            if (params != null) {
                for (Entry<String, String> entry : params.entrySet()) {
                    mapList.add(entry.getKey() + "=" + entry.getValue());
                }
            }
            if (CollectionUtils.isNotEmpty(mapList)) {
                url = url + "?";
                String paramsStr = StringUtils.join(mapList, "&");
                url = url + paramsStr;
            }
            httpGet = new HttpGet(url);
            httpGet.setHeader("Content-type", "application/json; charset=utf-8");
            httpGet.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            if (header != null) {
                for (Entry<String, String> entry : header.entrySet()) {
                    httpGet.setHeader(entry.getKey(), entry.getValue());
                }
            }
            HttpResponse response = httpClient.execute(httpGet);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) {
                throw new RuntimeException("請求失敗");
            } else {
                body = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (httpGet != null) {
                httpGet.releaseConnection();
            }
        }
        return body;
    }
    public static String sendPostJson(String url, String json, Map<String, String> header) throws Exception {
        HttpPost httpPost = null;
        String body = "";
        try {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            httpPost = new HttpPost(url);
            httpPost.setHeader("Content-type", "application/json; charset=utf-8");
            httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            if (header != null) {
                for (Entry<String, String> entry : header.entrySet()) {
                    httpPost.setHeader(entry.getKey(), entry.getValue());
                }
            }
            StringEntity entity = new StringEntity(json, Charset.forName("UTF-8"));
            entity.setContentEncoding("UTF-8");
            entity.setContentType("application/json");
            httpPost.setEntity(entity);
            HttpResponse response = httpClient.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) {
                throw new RuntimeException("請求失敗");
            } else {
                body = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (httpPost != null) {
                httpPost.releaseConnection();
            }
        }
        return body;
    }
    public static String sendPostForm(String url, Map<String, String> params, Map<String, String> header) throws Exception {
        HttpPost httpPost = null;
        String body = "";
        try {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            httpPost = new HttpPost(url);
            httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
            httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            if (header != null) {
                for (Entry<String, String> entry : header.entrySet()) {
                    httpPost.setHeader(entry.getKey(), entry.getValue());
                }
            }
            List<NameValuePair> nvps = new ArrayList<>();
            if (params != null) {
                for (Entry<String, String> entry : params.entrySet()) {
                    nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
            }
            //設置參數到請求對象中
            httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
            HttpResponse response = httpClient.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) {
                throw new RuntimeException("請求失敗");
            } else {
                body = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (httpPost != null) {
                httpPost.releaseConnection();
            }
        }
        return body;
    }
}

二.百度地圖開放平臺實現

1. 使用準備

閱讀文檔普通IP定位 | 百度地圖API SDK (baidu.com),成為開發(fā)者,獲取服務密鑰(AK)

2. 封裝實體類

/**
 * @author 擺渡人
 * @description 地址解析的結果
 * @date 2023/7/10 20:29
 */
@Data
public class IpAnalyzeBaiduResponse implements Serializable {
    /**
     * 返回狀態(tài)碼
     */
    private Integer status;
    /**
     * 錯誤信息
     */
    private String message;
    /**
     * 地址
     */
    private String address;
    /**
     * 詳細內容
     */
    private IpAnalyzeContent content;
}
/**
 * @author 擺渡人
 * @description 詳細內容
 * @date 2023/7/10 20:42
 */
@Data
public class IpAnalyzeContent implements Serializable {
    /**
     * 簡要地址
     */
    private String address;
    /**
     * 詳細地址信息
     */
    @JsonProperty("address_detail")
    private IpAnalyzeAddressDetail addressDetail;
    /**
     *  百度經緯度坐標值
     */
    @JsonProperty("point")
    private IpAnalyzePoint point;
}
/**
 * @author 擺渡人
 * @description 詳細地址信息
 * @date 2023/7/10 20:41
 */
@Data
public class IpAnalyzeAddressDetail implements Serializable {
    /**
     * 城市
     */
    private String city;
    /**
     * 百度城市代碼
     */
    @JsonProperty("city_code")
    private Integer cityCode;
    /**
     *  區(qū)縣
     */
    private String district;
    /**
     *  省份
     */
    private String province;
    /**
     * 街道
     */
    private String street;
    /**
     * 門地址
     */
    @JsonProperty("street_number")
    private String streetNumber;
}
/**
 * @author 擺渡人
 * @description 百度經緯度坐標值
 * @date 2023/7/10 20:43
 */
@Data
public class IpAnalyzePoint implements Serializable {
    private String x;
    private String y;
}

3.實現接口IPlatFormIpAnalyzeService

/**
 * @author 擺渡人
 * @description 百度地圖開發(fā)平臺實現類
 * @date 2023/7/10 20:27
 */
@Slf4j
public class PlatformBaiduService implements IPlatFormIpAnalyzeService {
    /**
     * 響應成功狀態(tài)碼
     */
    private final Integer OK_CODE = 0;
    @Value("${platform.conf.baidu.ak}")
    public String ak;
    @Override
    public IpAnalyzeResponse ipAnalyze(String ip) {
        String URL = "http://api.map.baidu.com/location/ip";
        Map<String,String> params = new HashMap<>();
        params.put("ip", ip);
        params.put("ak", ak);
        params.put("coor", "bd09ll");
        try {
            String json = SmartHttpUtil.sendGet(URL, params, null);
            IpAnalyzeBaiduResponse response = JSONUtil.toBean(json, IpAnalyzeBaiduResponse.class);
            if(OK_CODE.equals(response.getStatus())) {
                return IpAnalyzeResponse.builder()
                        .status(response.getStatus() + "")
                        .successFlag(true)
                        .msg(response.getMessage())
                        .province(response.getContent().getAddressDetail().getProvince())
                        .city(response.getContent().getAddressDetail().getCity())
                        .x(Double.parseDouble(response.getContent().getPoint().getX()))
                        .y(Double.parseDouble(response.getContent().getPoint().getY()))
                        .build();
            }
            return IpAnalyzeResponse.builder()
                    .status(response.getStatus() + "")
                    .successFlag(false)
                    .msg(response.getMessage())
                    .build();
        } catch (Exception e) {
            return IpAnalyzeResponse.builder()
                    .status("500")
                    .successFlag(false)
                    .msg(e.getMessage())
                    .build();
        }
    }
}

三.高德地圖開放平臺實現

1. 使用準備

根據文檔獲取Key-創(chuàng)建工程-開發(fā)指南-Web服務 API|高德地圖API (amap.com)指引獲取key

2. 封裝實體類

/**
 * @author 擺渡人
 * @description 高德地圖ip定位響應類
 * @date 2023/7/14 0:00
 */
@Data
public class IpAnalyzeGaodeResponse {
    /**
     * 返回結果狀態(tài)值,值為0或1,0表示失??;1表示成功
     */
    private String status;
    /**
     * 返回狀態(tài)說明,status為0時,info返回錯誤原因,否則返回“OK
     */
    private String info;
    /**
     * 返回狀態(tài)說明,10000代表正確,詳情參閱info狀態(tài)表
     */
    private String infocode;
    /**
     * 若為直轄市則顯示直轄市名稱;
     *
     * 如果在局域網 IP網段內,則返回“局域網”;
     *
     * 非法IP以及國外IP則返回空
     */
    private String province;
    /**
     * 若為直轄市則顯示直轄市名稱;
     *
     * 如果為局域網網段內IP或者非法IP或國外IP,則返回空
     */
    private String city;
    /**
     * 城市的adcode編碼
     */
    private String adcode;
    /**
     * 所在城市矩形區(qū)域范圍,所在城市范圍的左下右上對標對,如:116.0119343,39.66127144;116.7829835,40.2164962
     */
    private String rectangle;
}

3.實現接口IPlatFormIpAnalyzeService

/**
 * @author 擺渡人
 * @description 高德地圖開放平臺ip定位實現類
 * @date 2023/7/13 23:56
 */
@Slf4j
public class PlatformGaodeService implements IPlatFormIpAnalyzeService {
    /**
     * 響應成功狀態(tài)碼
     */
    private final String OK_CODE = "1";
    @Value("${platform.conf.gaode.key}")
    private String key;
    @Override
    public IpAnalyzeResponse ipAnalyze(String ip) {
        String URL = "https://restapi.amap.com/v3/ip";
        Map<String,String> params = new HashMap<>();
        params.put("key",key);
        params.put("ip",ip);
        try {
            String json = SmartHttpUtil.sendGet(URL, params, null);
            IpAnalyzeGaodeResponse response = JSONUtil.toBean(json, IpAnalyzeGaodeResponse.class);
            if(OK_CODE.equals(response.getStatus())) {
                IpAnalyzeResponse ipAnalyzeResponse = IpAnalyzeResponse.builder()
                        .status(response.getInfocode())
                        .successFlag(true)
                        .msg(response.getInfo())
                        .province(response.getProvince())
                        .city(response.getCity())
                        .build();
                // 對rectangle進行解析
                String rectangle = response.getRectangle();
                String[] split = rectangle.split(";|,");
                if(split.length == 1) {
                    ipAnalyzeResponse.setSuccessFlag(false);
                    ipAnalyzeResponse.setStatus("0");
                    ipAnalyzeResponse.setMsg("ip[" + ip + "]非法");
                    return ipAnalyzeResponse;
                }
                ipAnalyzeResponse.setX((Double.parseDouble(split[0]) + Double.parseDouble(split[2])) / 2.0);
                ipAnalyzeResponse.setY((Double.parseDouble(split[1]) + Double.parseDouble(split[3])) / 2.0);
                return ipAnalyzeResponse;
            }
            return IpAnalyzeResponse.builder()
                    .status(response.getInfocode())
                    .successFlag(false)
                    .msg(response.getInfo())
                    .build();
        } catch (Exception e) {
            e.printStackTrace();
            return IpAnalyzeResponse.builder()
                    .status(“500”)
                    .successFlag(false)
                    .msg(e.getMessage())
                    .build();
        }
    }
}

四. 使用

1.配置參數

# 第三方開放平臺的服務
platform:
  # 目前支持百度[baidu] 高德[gaode]
  mode: # 您選擇的服務
  # 相關配置
  conf:
    # 百度
    baidu:
      ak: # 您的百度地圖開放平臺服務密鑰(AK)
    # 高德
    gaode:
      key: # 您的高德地圖開放平臺key

2.配置類

根據配置參數中platform.mode的值選擇接口IPlatFormIpAnalyzeService的一個服務類注入Spring容器中去

/**
 * @author 擺渡人
 * @description 接口實現類配置
 * @date 2023/7/14 0:16
 */
@Configuration
public class PlatFormConfig {
    @Bean
    @ConditionalOnProperty(prefix = "platform",name = "mode",havingValue = "baidu")
    public IPlatFormIpAnalyzeService initBaiduIpAnalyzeService() {
        return new PlatformBaiduService();
    }
    @Bean
    @ConditionalOnProperty(prefix = "platform",name = "mode",havingValue = "gaode")
    public IPlatFormIpAnalyzeService initGaodeIpAnalyzeService() {
        return new PlatformGaodeService();
    }
}

3.單元測試

/**
 * @author 擺渡人
 * @description 
 * @date 2023/7/14 0:23
 */
@Slf4j
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class PlatformTest {
     @Autowired
    private IPlatFormIpAnalyzeService platFormIpAnalyzeService;
     @Test
     public void testIpAnalyzeService() {
         log.info("解析結果:{}",platFormIpAnalyzeService.ipAnalyze(null));
         log.info("解析結果:{}",platFormIpAnalyzeService.ipAnalyze(""));
         log.info("解析結果:{}",platFormIpAnalyzeService.ipAnalyze("127.0.0.1"));
         log.info("解析結果:{}",platFormIpAnalyzeService.ipAnalyze("114.247.50.2"));
         log.info("解析結果:{}",platFormIpAnalyzeService.ipAnalyze("219.137.148.0"));
         log.info("解析結果:{}",platFormIpAnalyzeService.ipAnalyze("114.80.166.240"));
     }
}

運行結果如下:

platform.mode=gaode

[2023-07-22 22:42:40,426][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=false, msg=ip[null]非法, province=[], city=[], x=null, y=null) (PlatformTest.java:26)
[2023-07-22 22:42:40,662][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=false, msg=ip[]非法, province=[], city=[], x=null, y=null) (PlatformTest.java:27)
[2023-07-22 22:42:40,898][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=false, msg=ip[127.0.0.1]非法, province=[], city=[], x=null, y=null) (PlatformTest.java:28)
[2023-07-22 22:42:41,132][INFO ][main] 解析結果:IpAnalyzeResponse(status=10000, successFlag=true, msg=OK, province=北京市, city=北京市, x=116.3974589, y=39.93888382) (PlatformTest.java:29)
[2023-07-22 22:42:41,365][INFO ][main] 解析結果:IpAnalyzeResponse(status=10000, successFlag=true, msg=OK, province=廣東省, city=廣州市, x=113.3893937, y=23.15653812) (PlatformTest.java:30)
[2023-07-22 22:42:41,600][INFO ][main] 解析結果:IpAnalyzeResponse(status=10000, successFlag=true, msg=OK, province=上海市, city=上海市, x=121.4767528, y=31.224348955) (PlatformTest.java:31)

platform.mode=baidu

[2023-07-22 22:40:48,774][INFO ][main] 解析結果:IpAnalyzeResponse(status=2, successFlag=false, msg=Request Parameter Error:ip illegal, province=null, city=null, x=null, y=null) (PlatformTest.java:26)
[2023-07-22 22:40:48,825][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=true, msg=null, province=廣東省, city=廣州市, x=113.27143134, y=23.13533631) (PlatformTest.java:27)
[2023-07-22 22:40:48,862][INFO ][main] 解析結果:IpAnalyzeResponse(status=1, successFlag=false, msg=Internal Service Error:ip[127.0.0.1] loc failed, province=null, city=null, x=null, y=null) (PlatformTest.java:28)
[2023-07-22 22:40:48,899][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=true, msg=null, province=北京市, city=北京市, x=116.4133837, y=39.91092455) (PlatformTest.java:29)
[2023-07-22 22:40:48,949][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=true, msg=null, province=廣東省, city=廣州市, x=113.27143134, y=23.13533631) (PlatformTest.java:30)
[2023-07-22 22:40:48,988][INFO ][main] 解析結果:IpAnalyzeResponse(status=0, successFlag=true, msg=null, province=上海市, city=上海市, x=121.48789949, y=31.24916171) (PlatformTest.java:31)

到此這篇關于Springboot利于第三方服務進行ip定位獲取省份城市的文章就介紹到這了,更多相關Springboot ip定位獲取省份城市內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 簡單了解JAVA變量類型及代碼實例

    簡單了解JAVA變量類型及代碼實例

    這篇文章主要介紹了簡單了解JAVA變量類型及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 消息隊列-kafka消費異常問題

    消息隊列-kafka消費異常問題

    這篇文章主要給大家介紹了關于kafka的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • 使用JavaMail發(fā)送郵件保證成功的方法

    使用JavaMail發(fā)送郵件保證成功的方法

    JavaMail是利用現有的郵件賬戶發(fā)送郵件的工具,使用過JavaMail的api發(fā)送郵件的人可能會有這樣一個疑惑:我如何知道我調用該api發(fā)送的郵件是否成功呢?那么通過下面這篇文章大家一起來看看使用JavaMail保證郵件發(fā)送成功的方法,有需要的朋友們可以參考借鑒。
    2016-11-11
  • spring cloud gateway集成hystrix實戰(zhàn)篇

    spring cloud gateway集成hystrix實戰(zhàn)篇

    這篇文章主要介紹了spring cloud gateway集成hystrix實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot實現訪問多個redis庫

    springboot實現訪問多個redis庫

    這篇文章主要介紹了springboot實現訪問多個redis庫方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • spring boot靜態(tài)變量注入配置文件詳解

    spring boot靜態(tài)變量注入配置文件詳解

    這篇文章主要為大家詳細介紹了spring boot靜態(tài)變量注入配置文件的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 淺談SpringMVC之視圖解析器(ViewResolver)

    淺談SpringMVC之視圖解析器(ViewResolver)

    本篇文章主要介紹了淺談SpringMVC之視圖解析器(ViewResolver),具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • 解決MyEclipse下啟動項目時JBoss內存溢出的問題

    解決MyEclipse下啟動項目時JBoss內存溢出的問題

    下面小編就為大家?guī)硪黄鉀QMyEclipse下啟動項目時JBoss內存溢出的問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 在?Java?中將Object?轉換為?Int的四種方法

    在?Java?中將Object?轉換為?Int的四種方法

    這篇文章主要介紹了在Java中如何將?Object?轉換為Int,本文研究了在?Java中將Object轉換為int的四種不同方法,結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • java中生成任意之間數的隨機數詳解

    java中生成任意之間數的隨機數詳解

    這篇文章主要介紹了java中生成任意之間數的隨機數詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論

佛坪县| 蓬溪县| 杨浦区| 巫溪县| 马公市| 新巴尔虎右旗| 东明县| 桐庐县| 林口县| 法库县| 普兰县| 玛纳斯县| 乌鲁木齐县| 治县。| 临沂市| 特克斯县| 措勤县| 大余县| 图木舒克市| 同江市| 芦山县| 东台市| 岳普湖县| 平顶山市| 高邮市| 麻城市| 偏关县| 吉安县| 通城县| 通江县| 聂拉木县| 沁水县| 泉州市| 清丰县| 鹿泉市| 普陀区| 南阳市| 徐闻县| 济源市| 潍坊市| 阳信县|