java根据ip获取城市
需求简介:
后台管理系统, 需要记录在线用户, 现在只差在线用户的详细位置,
网上一类教程不少, 有些稍微有些弯路, 因此在这里记录一下我的解决方案
自定义地址工具类
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" 前面会有一个空格, 若按照空格拆分时需注意