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);//中国湖北武汉江夏
}
}
Java获取客户端ip以及根据ip查询到相应的ip地址
猜你喜欢
转载自blog.csdn.net/qq844579582/article/details/52886614
今日推荐
周排行