Quellcode durchsuchen

增加用户定位接口。

xuxuan vor 5 Jahren
Ursprung
Commit
eaeb6edfec

+ 22 - 0
core/pom.xml

@@ -34,6 +34,19 @@
             <artifactId>powermock-api-mockito</artifactId>
             <version>1.6.4</version>
         </dependency>
+        <!--定位-->
+        <dependency>
+            <groupId>com.maxmind.geoip</groupId>
+            <artifactId>geoip-api</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.7.3</version>
+        </dependency>
+
 
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -136,6 +149,15 @@
             <artifactId>commons-fileupload</artifactId>
             <version>1.4</version>
         </dependency>
+
+      <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>fastjson</artifactId>
+        <version>1.2.66</version>
+    </dependency>
+
+
+
     </dependencies>
     <build>
         <plugins>

+ 218 - 0
core/src/main/java/com/mooctest/crowd/domain/IpAddress/AddressUtils.java

@@ -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);
+    }
+}

+ 24 - 0
core/src/main/java/com/mooctest/crowd/domain/IpAddress/Area.java

@@ -0,0 +1,24 @@
+package com.mooctest.crowd.domain.IpAddress;
+
+import lombok.Data;
+
+/**
+ * @author:xx
+ * @date:2020/7/10
+ * @description:
+ */
+
+@Data
+public class Area {
+
+    private  String pro;//省
+    private  String city;
+
+
+
+    public  Area(String pro,String city){
+        this.pro=pro;
+        this.city=city;
+    }
+
+}

+ 21 - 0
site/src/main/java/com/mooctest/crowd/site/controller/UserController.java

@@ -1,5 +1,7 @@
 package com.mooctest.crowd.site.controller;
 
+import com.mooctest.crowd.domain.IpAddress.AddressUtils;
+import com.mooctest.crowd.domain.IpAddress.Area;
 import com.mooctest.crowd.domain.exception.*;
 import com.mooctest.crowd.site.annotation.LoginRequired;
 import com.mooctest.crowd.site.annotation.SysAdminRequired;
@@ -13,6 +15,7 @@ import com.mooctest.crowd.site.data.vo.PersonalAuthVO;
 import com.mooctest.crowd.site.service.EnterpriseAuthService;
 import com.mooctest.crowd.site.service.PersonalAuthService;
 import com.mooctest.crowd.site.service.UserService;
+import com.mooctest.crowd.site.util.DataUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
@@ -20,8 +23,10 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
+import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author: Diors.Po
@@ -296,4 +301,20 @@ public class UserController extends BaseController {
         return userService.getAuthedList();
     }
 
+    /**
+     * 用户所在地
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = "index/address",method = RequestMethod.GET)
+    public Area getAddressByIp(HttpServletRequest request) throws UnsupportedEncodingException {
+
+         String ip=DataUtils.getClientIp(request);
+         LOG.info("ip地址是========"+ip);
+          Area   area= AddressUtils.getProvinceName(ip);
+         return  area;
+
+
+    }
+
 }

+ 45 - 0
site/src/main/java/com/mooctest/crowd/site/util/DataUtils.java

@@ -4,6 +4,10 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -64,7 +68,48 @@ public class DataUtils {
     private static <T> PageImpl<T> getEmptySubList(List<T> list, Pageable pageable) {
         return new PageImpl<>(new ArrayList(), pageable, list.size());
     }
+
+    public static String getClientIp(HttpServletRequest request) {
+        String ipAddress = null;
+        try {
+            ipAddress = request.getHeader("x-forwarded-for");
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getRemoteAddr();
+                if (ipAddress.equals("127.0.0.1")) {
+                    // 根据网卡取本机配置的IP
+                    InetAddress inet = null;
+                    try {
+                        inet = InetAddress.getLocalHost();
+                    } catch (UnknownHostException e) {
+                        e.printStackTrace();
+                    }
+                    ipAddress = inet.getHostAddress();
+                }
+            }
+            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
+                // = 15
+                if (ipAddress.indexOf(",") > 0) {
+                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+                }
+            }
+        } catch (Exception e) {
+            ipAddress="";
+        }
+        // ipAddress = this.getRequest().getRemoteAddr();
+
+        return ipAddress;
+    }
 }
 
 
 
+
+
+