|
@@ -0,0 +1,218 @@
|
|
|
+package com.mooctest.crowd.domain.IpAddress;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.jsoup.Connection;
|
|
|
+import org.jsoup.Jsoup;
|
|
|
+
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.net.HttpURLConnection;
|
|
|
+import java.net.URL;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 根据IP地址获取本地定位
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+/**
|
|
|
+ * @author: xuxuan
|
|
|
+ * @date: 2020/7/10
|
|
|
+ * @description:
|
|
|
+ */
|
|
|
+public class AddressUtils {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 得到本机的外网ip,出现异常时返回空串""
|
|
|
+ * @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();
|
|
|
+
|
|
|
+ // 获得包含本机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();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从文本串过滤出ip,用正则表达式将非数字和.替换成空串""
|
|
|
+ ip = ip.replaceAll("[^0-9.]", "");
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return ip;
|
|
|
+ }
|
|
|
+ return ip;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param urlStr
|
|
|
+ * 请求的地址
|
|
|
+ * @param content
|
|
|
+ * 请求的参数 格式为:name=xxx&pwd=xxx
|
|
|
+ * @param encoding
|
|
|
+ * 服务器端请求编码。如GBK,UTF-8等
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getResult(String urlStr, String content, String encoding) {
|
|
|
+ URL url = null;
|
|
|
+ HttpURLConnection connection = null;
|
|
|
+ try {
|
|
|
+ url = new URL(urlStr);
|
|
|
+ connection = (HttpURLConnection) url.openConnection();// 新建连接实例
|
|
|
+ connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒,如果运行时出现超时,可自行增大超时时间,如加到10000
|
|
|
+ connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒
|
|
|
+ connection.setDoOutput(true);// 是否打开输出流 true|false
|
|
|
+ connection.setDoInput(true);// 是否打开输入流true|false
|
|
|
+ connection.setRequestMethod("POST");// 提交方法POST|GET
|
|
|
+ connection.setUseCaches(false);// 是否缓存true|false
|
|
|
+ connection.connect();// 打开连接端口
|
|
|
+ DataOutputStream out = new DataOutputStream(connection
|
|
|
+ .getOutputStream());// 打开输出流往对端服务器写数据
|
|
|
+ out.writeBytes(content);// 写数据
|
|
|
+ out.flush();// 刷新
|
|
|
+ out.close();// 关闭输出流
|
|
|
+ BufferedReader reader = new BufferedReader(new InputStreamReader(
|
|
|
+ connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据
|
|
|
+ // ,以BufferedReader流来读取
|
|
|
+ StringBuffer buffer = new StringBuffer();
|
|
|
+ String line = "";
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
+ buffer.append(line);
|
|
|
+ }
|
|
|
+ reader.close();
|
|
|
+ return buffer.toString();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ if (connection != null) {
|
|
|
+ connection.disconnect();// 关闭连接
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * unicode 转换成 中文 *
|
|
|
+ * @param theString
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String decodeUnicode(String theString) {
|
|
|
+ char aChar;
|
|
|
+ int len = theString.length();
|
|
|
+ StringBuffer outBuffer = new StringBuffer(len);
|
|
|
+ for (int x = 0; x < len;) {
|
|
|
+ aChar = theString.charAt(x++);
|
|
|
+ if (aChar == '\\') {
|
|
|
+ aChar = theString.charAt(x++);
|
|
|
+ if (aChar == 'u') {
|
|
|
+ int value = 0;
|
|
|
+ for (int i = 0; i < 4; i++) {
|
|
|
+ aChar = theString.charAt(x++);
|
|
|
+ switch (aChar) {
|
|
|
+ case '0':
|
|
|
+ case '1':
|
|
|
+ case '2':
|
|
|
+ case '3':
|
|
|
+ case '4':
|
|
|
+ case '5':
|
|
|
+ case '6':
|
|
|
+ case '7':
|
|
|
+ case '8':
|
|
|
+ case '9':
|
|
|
+ value = (value << 4) + aChar - '0';
|
|
|
+ break;
|
|
|
+ case 'a':
|
|
|
+ case 'b':
|
|
|
+ case 'c':
|
|
|
+ case 'd':
|
|
|
+ case 'e':
|
|
|
+ case 'f':
|
|
|
+ value = (value << 4) + 10 + aChar - 'a';
|
|
|
+ break;
|
|
|
+ case 'A':
|
|
|
+ case 'B':
|
|
|
+ case 'C':
|
|
|
+ case 'D':
|
|
|
+ case 'E':
|
|
|
+ case 'F':
|
|
|
+ value = (value << 4) + 10 + aChar - 'A';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException(
|
|
|
+ "Malformed encoding.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ outBuffer.append((char) value);
|
|
|
+ } else {
|
|
|
+ if (aChar == 't') {
|
|
|
+ aChar = '\t';
|
|
|
+ } else if (aChar == 'r') {
|
|
|
+ aChar = '\r';
|
|
|
+ } else if (aChar == 'n') {
|
|
|
+ aChar = '\n';
|
|
|
+ } else if (aChar == 'f') {
|
|
|
+ aChar = '\f';
|
|
|
+ }
|
|
|
+ outBuffer.append(aChar);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ outBuffer.append(aChar);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return outBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param content
|
|
|
+ * 请求的参数 格式为:name=xxx&pwd=xxx
|
|
|
+ * @param encodingString
|
|
|
+ * 服务器端请求编码。如GBK,UTF-8等
|
|
|
+ * @return
|
|
|
+ * @throws UnsupportedEncodingException
|
|
|
+ */
|
|
|
+ public Area getAddresses(String content, String encodingString)
|
|
|
+ throws UnsupportedEncodingException {
|
|
|
+ // 这里调用PC-Online的接口
|
|
|
+ String urlStr = "http://whois.pconline.com.cn/ipJson.jsp?ip="+content+"&json=true";
|
|
|
+ log.info("urlStr=========="+urlStr);
|
|
|
+ // 从http://whois.pconline.com.cn取得IP所在的省市区信息
|
|
|
+ String returnStr = this.getResult(urlStr, content, encodingString);
|
|
|
+ log.info("返回数据================="+returnStr);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(returnStr);
|
|
|
+ String address=jsonObject.getString("addr");
|
|
|
+ Area area=new Area(jsonObject.getString("pro"),jsonObject.getString("city"));
|
|
|
+ return area;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 这里我们举的例子是获取所在地省份名称,也可以改变上边getAddress的返回值,获取具体的市县名
|
|
|
+ public static Area getProvinceName(String ip){
|
|
|
+ AddressUtils addressUtils = new AddressUtils();
|
|
|
+
|
|
|
+ Area area = null;
|
|
|
+ try {
|
|
|
+ area = addressUtils.getAddresses("ip="+ip, "GBK");
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return area;
|
|
|
+ }
|
|
|
+
|
|
|
+ //Main,输出省名
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
+ Area address= getProvinceName("");
|
|
|
+ System.out.println(address);
|
|
|
+ }
|
|
|
+}
|