IP定位网站源码分享带API,网页定位源码

大家好,今天小编来为大家解答以下的问题,关于IP定位网站源码分享带API,网页定位源码这个很多人还不知道,现在让我们一起来看看吧!

Springboot利于第三方服务进行ip定位获取省份城市等信息

在web应用的开发中,我们或许会想知道我们的用户请求的来源分布情况。本文基于springboot框架,调用百度地图、高德地图的开放平台api,在线对对请求来源的ip进行定位、解析,获取目标ip所对应的省份、城市、经纬度等信息,方便开发者将相关数据记录在操作日志中。

一.共用部分

统一响应类

java复制代码/**\n*@author摆渡人\n*@description统一响应类\n*@date2023/7/1323:26\n*/\n@Data\n@Builder\npublicclassIpAnalyzeResponse{\n\n/**\n*状态码\n*/\nprivateStringstatus;\n\n/**\n*是否成功\n*/\nprivateBooleansuccessFlag;\n\n/**\n*失败原因\n*/\nprivateStringmsg;\n\n/**\n*省份名称\n*/\nprivateStringprovince;\n\n/**\n*城市名称\n*/\nprivateStringcity;\n\n/**\n*经度\n*/\nprivateDoublex;\n\n/**\n*维度\n*/\nprivateDoubley;\n}\n

定义接口

实现该接口,并在配置类中注入接口的实现类,即可拓展ip定位的更多实现方式

java复制代码/**\n*@author摆渡人\n*@descriptionip定位接口\n*@date2023/7/1323:25\n*/\npublicinterfaceIPlatFormIpAnalyzeService{\n\n/**\n*ip定位解析\n*@paramip\n*@return\n*/\nIpAnalyzeResponseipAnalyze(Stringip);\n}\n

http请求工具类(用于发送http请求)

源码来自SmartAdmin

java复制代码/**\n*[HttpUtils]\n*\n*@authoryandanyang\n*@version1.0\n*@company1024lab.net\n*@copyright(c)20191024lab.netInc.Allrightsreserved.\n*@date\n*@sinceJDK1.8\n*/\npublicclassSmartHttpUtil{\n\npublicstaticStringsendGet(Stringurl,Map<String,String>params,Map<String,String>header)throwsException{\nHttpGethttpGet=null;\nStringbody=&34;;\ntry{\nCloseableHttpClienthttpClient=HttpClients.createDefault();\nList<String>mapList=newArrayList<>();\nif(params!=null){\nfor(Entry<String,String>entry:params.entrySet()){\nmapList.add(entry.getKey()+&34;+entry.getValue());\n}\n}\nif(CollectionUtils.isNotEmpty(mapList)){\nurl=url+&34;;\nStringparamsStr=StringUtils.join(mapList,&34;);\nurl=url+paramsStr;\n}\nhttpGet=newHttpGet(url);\nhttpGet.setHeader(&34;,&34;);\nhttpGet.setHeader(&34;,&34;);\nif(header!=null){\nfor(Entry<String,String>entry:header.entrySet()){\nhttpGet.setHeader(entry.getKey(),entry.getValue());\n}\n}\nHttpResponseresponse=httpClient.execute(httpGet);\n\nintstatusCode=response.getStatusLine().getStatusCode();\nif(statusCode!=HttpStatus.SC_OK){\nthrownewRuntimeException(&34;);\n}else{\nbody=EntityUtils.toString(response.getEntity(),&34;);\n}\n}catch(Exceptione){\nthrowe;\n}finally{\nif(httpGet!=null){\nhttpGet.releaseConnection();\n}\n}\nreturnbody;\n}\n\npublicstaticStringsendPostJson(Stringurl,Stringjson,Map<String,String>header)throwsException{\nHttpPosthttpPost=null;\nStringbody=&34;;\ntry{\nCloseableHttpClienthttpClient=HttpClients.createDefault();\nhttpPost=newHttpPost(url);\nhttpPost.setHeader(&34;,&34;);\nhttpPost.setHeader(&34;,&34;);\nif(header!=null){\nfor(Entry<String,String>entry:header.entrySet()){\nhttpPost.setHeader(entry.getKey(),entry.getValue());\n}\n}\nStringEntityentity=newStringEntity(json,Charset.forName(&34;));\nentity.setContentEncoding(&34;);\nentity.setContentType(&34;);\nhttpPost.setEntity(entity);\nHttpResponseresponse=httpClient.execute(httpPost);\n\nintstatusCode=response.getStatusLine().getStatusCode();\nif(statusCode!=HttpStatus.SC_OK){\nthrownewRuntimeException(&34;);\n}else{\nbody=EntityUtils.toString(response.getEntity(),&34;);\n}\n}catch(Exceptione){\nthrowe;\n}finally{\nif(httpPost!=null){\nhttpPost.releaseConnection();\n}\n}\nreturnbody;\n}\n\npublicstaticStringsendPostForm(Stringurl,Map<String,String>params,Map<String,String>header)throwsException{\nHttpPosthttpPost=null;\nStringbody=&34;;\ntry{\nCloseableHttpClienthttpClient=HttpClients.createDefault();\nhttpPost=newHttpPost(url);\nhttpPost.setHeader(&34;,&34;);\nhttpPost.setHeader(&34;,&34;);\nif(header!=null){\nfor(Entry<String,String>entry:header.entrySet()){\nhttpPost.setHeader(entry.getKey(),entry.getValue());\n}\n}\nList<NameValuePair>nvps=newArrayList<>();\nif(params!=null){\nfor(Entry<String,String>entry:params.entrySet()){\nnvps.add(newBasicNameValuePair(entry.getKey(),entry.getValue()));\n}\n}\n//设置参数到请求对象中\nhttpPost.setEntity(newUrlEncodedFormEntity(nvps,&34;));\nHttpResponseresponse=httpClient.execute(httpPost);\n\nintstatusCode=response.getStatusLine().getStatusCode();\nif(statusCode!=HttpStatus.SC_OK){\nthrownewRuntimeException(&34;);\n}else{\nbody=EntityUtils.toString(response.getEntity(),&34;);\n}\n}catch(Exceptione){\nthrowe;\n}finally{\nif(httpPost!=null){\nhttpPost.releaseConnection();\n}\n}\nreturnbody;\n}\n\n}\n

二.百度地图开放平台实现

1.使用准备

阅读文档普通IP定位|百度地图APISDK(baidu.com),成为开发者,获取服务密钥(AK)

2.封装实体类

java复制代码/**\n*@author摆渡人\n*@description地址解析的结果\n*@date2023/7/1020:29\n*/\n@Data\npublicclassIpAnalyzeBaiduResponseimplementsSerializable{\n\n/**\n*返回状态码\n*/\nprivateIntegerstatus;\n\n/**\n*错误信息\n*/\nprivateStringmessage;\n\n/**\n*地址\n*/\nprivateStringaddress;\n\n/**\n*详细内容\n*/\nprivateIpAnalyzeContentcontent;\n\n}\n

java复制代码/**\n*@author摆渡人\n*@description详细内容\n*@date2023/7/1020:42\n*/\n@Data\npublicclassIpAnalyzeContentimplementsSerializable{\n\n/**\n*简要地址\n*/\nprivateStringaddress;\n\n/**\n*详细地址信息\n*/\n@JsonProperty(&34;)\nprivateIpAnalyzeAddressDetailaddressDetail;\n\n/**\n*百度经纬度坐标值\n*/\n@JsonProperty(&34;)\nprivateIpAnalyzePointpoint;\n\n}\n

java复制代码/**\n*@author摆渡人\n*@description详细地址信息\n*@date2023/7/1020:41\n*/\n@Data\npublicclassIpAnalyzeAddressDetailimplementsSerializable{\n\n/**\n*城市\n*/\nprivateStringcity;\n\n/**\n*百度城市代码\n*/\n@JsonProperty(&34;)\nprivateIntegercityCode;\n\n/**\n*区县\n*/\nprivateStringdistrict;\n\n/**\n*省份\n*/\nprivateStringprovince;\n\n/**\n*街道\n*/\nprivateStringstreet;\n\n/**\n*门地址\n*/\n@JsonProperty(&34;)\nprivateStringstreetNumber;\n\n}\n

java复制代码/**\n*@author摆渡人\n*@description百度经纬度坐标值\n*@date2023/7/1020:43\n*/\n@Data\npublicclassIpAnalyzePointimplementsSerializable{\n\nprivateStringx;\n\nprivateStringy;\n}\n

3.实现接口IPlatFormIpAnalyzeService

java复制代码/**\n*@author摆渡人\n*@description百度地图开发平台实现类\n*@date2023/7/1020:27\n*/\n@Slf4j\npublicclassPlatformBaiduServiceimplementsIPlatFormIpAnalyzeService{\n\n/**\n*响应成功状态码\n*/\nprivatefinalIntegerOK_CODE=0;\n\n@Value(&34;)\npublicStringak;\n\n@Override\npublicIpAnalyzeResponseipAnalyze(Stringip){\nStringURL=&34;;\nMap<String,String>params=newHashMap<>();\nparams.put(&34;,ip);\nparams.put(&34;,ak);\nparams.put(&34;,&34;);\ntry{\nStringjson=SmartHttpUtil.sendGet(URL,params,null);\nIpAnalyzeBaiduResponseresponse=JSONUtil.toBean(json,IpAnalyzeBaiduResponse.class);\nif(OK_CODE.equals(response.getStatus())){\nreturnIpAnalyzeResponse.builder()\n.status(response.getStatus()+&34;)\n.successFlag(true)\n.msg(response.getMessage())\n.province(response.getContent().getAddressDetail().getProvince())\n.city(response.getContent().getAddressDetail().getCity())\n.x(Double.parseDouble(response.getContent().getPoint().getX()))\n.y(Double.parseDouble(response.getContent().getPoint().getY()))\n.build();\n}\nreturnIpAnalyzeResponse.builder()\n.status(response.getStatus()+&34;)\n.successFlag(false)\n.msg(response.getMessage())\n.build();\n}catch(Exceptione){\nreturnIpAnalyzeResponse.builder()\n.status(&34;)\n.successFlag(false)\n.msg(e.getMessage())\n.build();\n}\n}\n}\n

三.高德地图开放平台实现

1.使用准备

根据文档获取Key-创建工程-开发指南-Web服务API|高德地图API(amap.com)指引获取key

2.封装实体类

java复制代码/**\n*@author摆渡人\n*@description高德地图ip定位响应类\n*@date2023/7/140:00\n*/\n@Data\npublicclassIpAnalyzeGaodeResponse{\n\n/**\n*返回结果状态值,值为0或1,0表示失败;1表示成功\n*/\nprivateStringstatus;\n\n/**\n*返回状态说明,status为0时,info返回错误原因,否则返回“OK\n*/\nprivateStringinfo;\n\n/**\n*返回状态说明,10000代表正确,详情参阅info状态表\n*/\nprivateStringinfocode;\n\n/**\n*若为直辖市则显示直辖市名称;\n*\n*如果在局域网IP网段内,则返回“局域网”;\n*\n*非法IP以及国外IP则返回空\n*/\nprivateStringprovince;\n\n/**\n*若为直辖市则显示直辖市名称;\n*\n*如果为局域网网段内IP或者非法IP或国外IP,则返回空\n*/\nprivateStringcity;\n\n/**\n*城市的adcode编码\n*/\nprivateStringadcode;\n\n/**\n*所在城市矩形区域范围,所在城市范围的左下右上对标对,如:116.0119343,39.66127144;116.7829835,40.2164962\n*/\nprivateStringrectangle;\n}\n

3.实现接口IPlatFormIpAnalyzeService

java复制代码/**\n*@author摆渡人\n*@description高德地图开放平台ip定位实现类\n*@date2023/7/1323:56\n*/\n@Slf4j\npublicclassPlatformGaodeServiceimplementsIPlatFormIpAnalyzeService{\n\n/**\n*响应成功状态码\n*/\nprivatefinalStringOK_CODE=&34;;\n\n@Value(&34;)\nprivateStringkey;\n\n@Override\npublicIpAnalyzeResponseipAnalyze(Stringip){\nStringURL=&34;;\nMap<String,String>params=newHashMap<>();\nparams.put(&34;,key);\nparams.put(&34;,ip);\ntry{\nStringjson=SmartHttpUtil.sendGet(URL,params,null);\nIpAnalyzeGaodeResponseresponse=JSONUtil.toBean(json,IpAnalyzeGaodeResponse.class);\nif(OK_CODE.equals(response.getStatus())){\nIpAnalyzeResponseipAnalyzeResponse=IpAnalyzeResponse.builder()\n.status(response.getInfocode())\n.successFlag(true)\n.msg(response.getInfo())\n.province(response.getProvince())\n.city(response.getCity())\n.build();\n//对rectangle进行解析\nStringrectangle=response.getRectangle();\nString[]split=rectangle.split(&34;);\nif(split.length==1){\nipAnalyzeResponse.setSuccessFlag(false);\nipAnalyzeResponse.setStatus(&34;);\nipAnalyzeResponse.setMsg(&34;+ip+&34;);\nreturnipAnalyzeResponse;\n}\nipAnalyzeResponse.setX((Double.parseDouble(split[0])+Double.parseDouble(split[2]))/2.0);\nipAnalyzeResponse.setY((Double.parseDouble(split[1])+Double.parseDouble(split[3]))/2.0);\nreturnipAnalyzeResponse;\n}\nreturnIpAnalyzeResponse.builder()\n.status(response.getInfocode())\n.successFlag(false)\n.msg(response.getInfo())\n.build();\n}catch(Exceptione){\ne.printStackTrace();\nreturnIpAnalyzeResponse.builder()\n.status(“500”)\n.successFlag(false)\n.msg(e.getMessage())\n.build();\n}\n}\n}\n

四.使用

1.配置参数

yaml复制代码目前支持百度[baidu]高德[gaode]\nmode:相关配置\nconf:\n您的百度地图开放平台服务密钥(AK)\n您的高德地图开放平台key\n

2.配置类

根据配置参数中platform.mode的值选择接口IPlatFormIpAnalyzeService的一个服务类注入Spring容器中去

java复制代码/**\n*@author摆渡人\n*@description接口实现类配置\n*@date2023/7/140:16\n*/\n@Configuration\npublicclassPlatFormConfig{\n\n@Bean\n@ConditionalOnProperty(prefix=&34;,name=&34;,havingValue=&34;)\npublicIPlatFormIpAnalyzeServiceinitBaiduIpAnalyzeService(){\nreturnnewPlatformBaiduService();\n}\n\n@Bean\n@ConditionalOnProperty(prefix=&34;,name=&34;,havingValue=&34;)\npublicIPlatFormIpAnalyzeServiceinitGaodeIpAnalyzeService(){\nreturnnewPlatformGaodeService();\n}\n}\n

3.单元测试

java复制代码/**\n*@author摆渡人\n*@description\n*@date2023/7/140:23\n*/\n@Slf4j\n@ExtendWith(SpringExtension.class)\n@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.DEFINED_PORT)\npublicclassPlatformTest{\n\n@Autowired\nprivateIPlatFormIpAnalyzeServiceplatFormIpAnalyzeService;\n\n@Test\npublicvoidtestIpAnalyzeService(){\nlog.info(&34;,platFormIpAnalyzeService.ipAnalyze(null));\nlog.info(&34;,platFormIpAnalyzeService.ipAnalyze(&34;));\nlog.info(&34;,platFormIpAnalyzeService.ipAnalyze(&34;));\nlog.info(&34;,platFormIpAnalyzeService.ipAnalyze(&34;));\nlog.info(&34;,platFormIpAnalyzeService.ipAnalyze(&34;));\nlog.info(&34;,platFormIpAnalyzeService.ipAnalyze(&34;));\n}\n\n}\n

运行结果如下:

platform.mode=gaodetxt复制代码[2023-07-2222:42:40,426][INFO][main]解析结果:IpAnalyzeResponse(status=0,successFlag=false,msg=ip[null]非法,province=[],city=[],x=null,y=null)(PlatformTest.java:26)[2023-07-2222:42:40,662][INFO][main]解析结果:IpAnalyzeResponse(status=0,successFlag=false,msg=ip[]非法,province=[],city=[],x=null,y=null)(PlatformTest.java:27)[2023-07-2222: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-2222: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-2222: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-2222: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=baidutxt复制代码[2023-07-2222:40:48,774][INFO][main]解析结果:IpAnalyzeResponse(status=2,successFlag=false,msg=RequestParameterError:ipillegal,province=null,city=null,x=null,y=null)(PlatformTest.java:26)[2023-07-2222: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-2222:40:48,862][INFO][main]解析结果:IpAnalyzeResponse(status=1,successFlag=false,msg=InternalServiceError:ip[127.0.0.1]locfailed,province=null,city=null,x=null,y=null)(PlatformTest.java:28)[2023-07-2222: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-2222: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-2222:40:48,988][INFO][main]解析结果:IpAnalyzeResponse(status=0,successFlag=true,msg=null,pro

作者:化尘成影链接:https://juejin.cn/post/7258483700816019516

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

站内搜索