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

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")为unknown
			ip = 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)){
			//在这里我们定义一个最糟糕的情况就是都获取不到IP
			ip = "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);//中国湖北武汉江夏
	}
}


猜你喜欢

转载自blog.csdn.net/qq844579582/article/details/52886614