Springboot根據IP分析出地址(使用淘寶和新浪IP庫)
阿新 • • 發佈:2019-01-28
1、新增請求地址到配置檔案中
把淘寶和新浪的請求地址新增到配置檔案中,用,分開,並且把要分析的ip引數放到最後,這是為了方便後面的組裝url
swallow.ip.analysis = http://ip.taobao.com/service/getIpInfo.php?ip=,http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=
2、新增實體pojo
淘寶的返回資訊實體:
package com.cy.example.carrier;
public class IpAnalysisCa_Tb {
/*
* 1. 響應資訊:
(json格式的)國家 、省(自治區或直轄市)、市(縣)、運營商
2. 返回資料格式:
{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",
"region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
"county_id":"-1","isp_id":"100017"}}
其中code的值的含義為,0:成功,1:失敗。
*/
private int code;
private Data data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public class Data{
private String ip;
//國家
private String country;
private String area;
private String region;
private String city;
private String county;
private String isp;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
}
}
新浪的返回資訊實體:
package com.cy.example.carrier;
public class IpAnalysisCa_Sina {
/*
* 2. 響應資訊:
(json格式的)國家 、省(自治區或直轄市)、市(縣)、運營商
3. 返回資料格式:
var remote_ip_info = {"ret":1,"start":-1,"end":-1,"country":"\u4e2d\u56fd"
,"province":"\u4e0a\u6d77","city":"\u4e0a\u6d77","district":"","isp":"","type":"","desc":""};
其中code的值的含義為,1成功
*/
private int ret;
private String country;
private String province;
private String city;
private String isp;
private String type;
private String desc;
public int getRet() {
return ret;
}
public void setRet(int ret) {
this.ret = ret;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
3、HTTP的工具類
用於獲取到ip後發起http請求,獲取到請求ip的地址
package com.cy.example.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HttpRequestUtil {
private static final CloseableHttpClient httpclient = HttpClients.createDefault();
private static final String userAgent = "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36";
public static String get(String url) {
String result = null;
CloseableHttpResponse response = null;
try {
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent", userAgent);
response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
}
return result;
}
public static String post(String url, Map<String, String> map) {
// 設定引數
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> entry : map.entrySet()) {
formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
// 編碼
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
// 取得HttpPost物件
HttpPost httpPost = new HttpPost(url);
// 防止被當成攻擊新增的
httpPost.setHeader("User-Agent", userAgent);
// 引數放入Entity
httpPost.setEntity(formEntity);
CloseableHttpResponse response = null;
String result = null;
try {
// 執行post請求
response = httpclient.execute(httpPost);
// 得到entity
HttpEntity entity = response.getEntity();
// 得到字串
result = EntityUtils.toString(entity);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
}
return result;
}
}
4、具體的使用
在我自己的使用的具體業務場景是:使用者登入成功之後,會把相應的登陸記錄實體傳送到訊息佇列,在傳送之前首先會把使用者登入的ip解析出是哪個省份的,如果在請求淘寶ip地址庫失敗時,會請求在配置檔案中的第二個地址,也就是新浪的ip庫。
//拼裝地ip地址
String tbUrl = ipAnalysis.split(",")[0] + loginRecord.getC_loginIp();
try {
//獲取淘寶庫返回的內容
String addr = HttpRequestUtil.get(tbUrl);
//將返回的json資料轉換成實體物件
IpAnalysisCa_Tb ipAnalusisTb = JsonUtil.toBean(addr, IpAnalysisCa_Tb.class);
//進行請求成功與否的判斷
if(0 == ipAnalusisTb.getCode()){
//判斷是否是內網地址
if(StringUtil.IsEqual("XX", ipAnalusisTb.getData().getRegion())){
loginRecord.setC_province(ipAnalusisTb.getData().getCity());
}else{
loginRecord.setC_province(ipAnalusisTb.getData().getRegion());
}
}else{
//這是新浪的請求地址,方法和以上相似就不一一備註了
String sinaUrl = ipAnalysis.split(",")[1] + loginRecord.getC_loginIp();
addr = HttpRequestUtil.get(sinaUrl);
IpAnalysisCa_Sina ipAnalusisSina = JsonUtil.toBean(addr, IpAnalysisCa_Sina.class);
if(1 == ipAnalusisSina.getRet()){
loginRecord.setC_province(ipAnalusisSina.getProvince());
}else{
loginRecord.setC_province("未知");
}
}
} catch (Exception e) {
// TODO: handle exception
logger.info("解析IP出錯!");
loginRecord.setC_province("未知");
}
logger.info("傳送物件資訊: " + loginRecord.toString());
this.rabbitTemplate.convertAndSend(RabbitConfig.QUEUE_LOGINRECORD, loginRecord);