需求简介:
后台管理系统, 需要记录在线用户, 现在只差在线用户的详细位置,
网上一类教程不少, 有些稍微有些弯路, 因此在这里记录一下我的解决方案
自定义地址工具类
1 import java.io.*;
2 import java.net.HttpURLConnection;
3 import java.net.URL;
4
5 public class AddressUtils {
6
7 /**
8 *
9 * @param content
10 * @param encodingString
11 * @return
12 * @throws UnsupportedEncodingException
13 */
14 public String getAddresses(String content, String encodingString)
15 throws UnsupportedEncodingException {
16 // 这里调用接口
17 String urlStr = "http://whois.pconline.com.cn/ip.jsp";
18 // 从http://whois.pconline.com.cn取得IP所在的省市区信息
19 String returnStr = this.getResult(urlStr, content, encodingString);
20 if (returnStr != null) {
21 // 处理返回的省市区信息
22 String[] temp = returnStr.split(" ");
23 if(temp.length<2){
24 return "0";//无效IP
25 }
26 String region = temp[0];
27 if(StringUtil.isNull(region) || region.trim().equals("")){
28 region = temp[1];
29 }
30 return region;
31 }
32 return "未知";
33 }
34
35 /**
36 * @param urlStr
37 * @param content
38 * @param encoding
39 * @return
40 */
41 private String getResult(String urlStr, String content, String encoding) {
42 URL url = null;
43 HttpURLConnection connection = null;
44 try {
45 url = new URL(urlStr);
46 connection = (HttpURLConnection) url.openConnection();// 新建连接实例
47 connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒
48 connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒
49 connection.setDoOutput(true);// 是否打开输出流 true|false
50 connection.setDoInput(true);// 是否打开输入流true|false
51 connection.setRequestMethod("POST");// 提交方法POST|GET
52 connection.setUseCaches(false);// 是否缓存true|false
53 connection.connect();// 打开连接端口
54 DataOutputStream out = new DataOutputStream(connection
55 .getOutputStream());// 打开输出流往对端服务器写数据
56 out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx
57 out.flush();// 刷新
58 out.close();// 关闭输出流
59 BufferedReader reader = new BufferedReader(new InputStreamReader(
60 connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据
61 // ,以BufferedReader流来读取
62 StringBuffer buffer = new StringBuffer();
63 String line = "";
64 while ((line = reader.readLine()) != null) {
65 buffer.append(line);
66 }
67 reader.close();
68 return buffer.toString();
69 } catch (IOException e) {
70 e.printStackTrace();
71 } finally {
72 if (connection != null) {
73 connection.disconnect();// 关闭连接
74 }
75 }
76 return null;
77 }
78
79 /**
80 *
81 * @param ip
82 * @return
83 */
84 public static String getCity(String ip) {
85 AddressUtils addressUtils = new AddressUtils();
86 String address = "";
87 try {
88 address = addressUtils.getAddresses("ip="+ip, "gbk");
89 } catch (UnsupportedEncodingException e) {
90 // TODO Auto-generated catch block
91 e.printStackTrace();
92 }
93 return address;
94 }
95 }
这里获取地址的接口没有用淘宝接口, 因为现在淘宝接口需要一个公钥, 否则会一直提示这个错误
{"msg":"the request over max qps for user ,the accessKey=public","code":4}
调用下面这个方法即可获取
AddressUtils.getCity(ip);
它的最后返回结果是这样的
xx省xx市 电信
需要省市可以在 getAddresses 方法中做一下处理, 若是局域网, 则会显示
局域网IP
需要注意的是, " 局域网IP" 前面会有一个空格, 若按照空格拆分时需注意