Java获取客户端ip以及根据ip查询到相应的ip地址

来源:互联网 发布:淘宝客服转接设置 编辑:程序博客网 时间:2024/05/17 01:09
package com.xj.console.util;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;import com.alibaba.fastjson.JSONObject;/** * 实现根据客户端传过来的请求获取 * 用户的IP地址;根据IP地址查询到用户登录情况 * @author pyi * */public class IpTest {//这里我们是通过百度的接口获取IP地理位置public static final String httpUrl = "http://apis.baidu.com/apistore/iplookupservice/iplookup";//public static final String httpUrl = "http://ip.taobao.com/service/getIpInfo.php";这个接口要比百度的弱很多/** * 获取IP * @param request * @return */public static String getIp(HttpServletRequest request){//客户端采取代理服务器访问后台,那么通过请求头里面"x-forwarded-for"可以访问到原客户端信息String ip = request.getHeader("x-forwarded-for");if(StringUtils.isBlank(ip)||"unknown".equalsIgnoreCase(ip)){//squid缓存代理机制(根据squid.conf配置文件中forwarded-for的配置)//如果forwarded-for的状态为off则request.getHeader("x-forwarded-for")为unknownip = request.getHeader("Proxy-Client-IP");}if(StringUtils.isBlank(ip)||"unknown".equalsIgnoreCase(ip)){ip = request.getHeader("WL-Proxy-Client-IP");}if(StringUtils.isBlank(ip)||"unknown".equalsIgnoreCase(ip)){//通常情况下,要是没有中间层通过getRemoteAddr的方法就能获取到客户端的IP地址ip = request.getRemoteAddr();}if(StringUtils.isBlank(ip)||"unknown".equalsIgnoreCase(ip)){//在这里我们定义一个最糟糕的情况就是都获取不到IPip = "unknown";}return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;}/** * 将ip传入接口中获取接口传过来的数据 * @param ip * @return */public static String getJsonOb(String ip){BufferedReader br = null;HttpURLConnection conn = null;try{if(StringUtils.isBlank(ip)||"unknown".equals(ip)){return null;}URL url = new URL(httpUrl+"?ip="+ip);conn = (HttpURLConnection) url.openConnection();/* * //设置一些属性,在这里暂时不用 conn.setReadTimeout(2000);//设置读取数据的时间 * conn.setConnectTimeout(2000);//设置建立连接的时间 * conn.setDoInput(true);//设置是否能读取数据 * conn.setDoOutput(true);//设置是否能写入数据 * conn.setRequestMethod("GET");//设置请求的类型 * conn.setUseCaches(false);//设置是否缓存 */conn.setRequestMethod("GET");//访问百度接口要传入一个apikey值conn.setRequestProperty("apikey", "0147bd89c5ec1286db311759d326695c");conn.connect();//建立连接/*在这里一旦采用POST请求发送数据,那么是要用到写入数据 * DataOutputStream dos = new DataOutputStream(conn.getOutputStream());dos.writeBytes("ip"+ip);dos.flush();dos.close();*/br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));StringBuffer sb = new StringBuffer();String line = "";while((line = br.readLine())!=null){sb.append(line);}br.close();return sb.toString();}catch(Exception e){return null;}finally{conn.disconnect();}}public static String getAddressByJsonOb(String jsonOb){if(StringUtils.isBlank(jsonOb)){return "";}JSONObject json = JSONObject.parseObject(jsonOb);if("0".equals(json.get("errNum").toString())){ StringBuffer sb = new StringBuffer();  JSONObject optJson = json.getJSONObject("retData"); sb.append(optJson.getString("country"))//国家 //.append(optJson.getString("area"))//地区(华中) .append(optJson.getString("province"))//省份 .append(optJson.getString("city"))//市区 .append(optJson.getString("district"));//地区 return sb.toString();}else{return "";}}public static void main(String[] args) {String add = getAddressByJsonOb(getJsonOb("113.57.168.243"));System.out.println(add);//中国湖北武汉江夏}}

1 0