Java如何根据IP获取当前定位
當(dāng)今購(gòu)物、旅游等服務(wù)型的網(wǎng)站如此流行,我們有時(shí)候也會(huì)碰到這樣網(wǎng)站的開(kāi)發(fā)。
在開(kāi)發(fā)此類(lèi)網(wǎng)站時(shí),為了增加用戶的體驗(yàn)感受,我們不得不在用戶剛進(jìn)入網(wǎng)站時(shí)定位到用戶所在地,
更好的為用戶推薦當(dāng)?shù)禺a(chǎn)品。比如去哪兒,攜程,美團(tuán)等都會(huì)有定位功能。
那么我們?cè)鯓印百N心”的為用戶定位呢?
?
1.首先我們需要先獲取本機(jī)的外網(wǎng)ip
/**
* 得到本機(jī)的外網(wǎng)ip,出現(xiàn)異常時(shí)返回空串""
* @return
*/
public static String getPublicIP() {
String ip = "";
org.jsoup.nodes.Document doc = null;
Connection con = null;
con = Jsoup.connect("http://www.ip138.com/ip2city.asp").timeout(10000);
try {
doc = con.get();
// 獲得包含本機(jī)ip的文本串:您的IP是:[xxx.xxx.xxx.xxx]
org.jsoup.select.Elements els = doc.body().select("center");
for (org.jsoup.nodes.Element el : els) {
ip = el.text();
}
// 從文本串過(guò)濾出ip,用正則表達(dá)式將非數(shù)字和.替換成空串""
ip = ip.replaceAll("[^0-9.]", "");
} catch (IOException e) {
e.printStackTrace();
}
return ip;
}
2.定義一個(gè)方法,將字符拼接成字符串
private static String readAll(Reader rd) throws IOException {StringBuilder sb = new StringBuilder();int cp;while ((cp = rd.read()) != -1) {sb.append((char) cp);}return sb.toString();}3.將URL資源解析成json對(duì)象
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {InputStream is = null;try {is = new URL(url).openStream();BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));String jsonText = readAll(rd);JSONObject json = new JSONObject(jsonText);return json;} finally {//關(guān)閉輸入流 is.close();}}4.獲取當(dāng)?shù)氐刂访?#xff0c;這個(gè)可以根據(jù)自己的具體需求更改。參數(shù)ak后面的值是ip定位api服務(wù)的密鑰,
這個(gè)可以自己去百度申請(qǐng),詳見(jiàn) http://api.map.baidu.com/lbsapi/cloud/ip-location-api.htm
public static String getAddrName() throws JSONException, IOException{//這里調(diào)用百度的ip定位api服務(wù) 詳見(jiàn) http://api.map.baidu.com/lbsapi/cloud/ip-location-api.htmJSONObject json = readJsonFromUrl("http://api.map.baidu.com/location/ip?ak=iTrwV0ddxeFT6QUziPQh2wgGofxmWkmg&ip="+getPublicIP());/* 獲取到的json對(duì)象:* {"address":"CN|河北|保定|None|UNICOM|0|0",* "content":{"address_detail":{"province":"河北省","city":"保定市","street":"","district":"","street_number":"","city_code":307},* "address":"河北省保定市","point":{"x":"12856963.35","y":"4678360.5"}},* "status":0}*///這里我們可以輸出json看一下具體格式
System.out.println(json.toString());
JSONObject content=json.getJSONObject("content"); //獲取json對(duì)象里的content對(duì)象JSONObject addr_detail=content.getJSONObject("address_detail");//從content對(duì)象里獲取address_detailString city=addr_detail.get("city").toString(); //獲取市名,可以根據(jù)具體需求更改,如果需要獲取省份的名字,可以把“city”改成“province”...return city;}
5.這里我們寫(xiě)一個(gè)主方法方便于測(cè)試
public static void main(String[] args) throws IOException, JSONException {System.out.println(getAddrName());}?
運(yùn)行結(jié)果:
?
轉(zhuǎn)載于:https://www.cnblogs.com/huozf/p/6284013.html
總結(jié)
以上是生活随笔為你收集整理的Java如何根据IP获取当前定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: H3 BPM报销流程开发示例
- 下一篇: 建议大家使用Java 8 的日期、时间,