JAVA获取地址
调用接口
方式一
通过
request
来获取访问者的地址
信息
https://ip.ws.126.net/ipquery
首先需要先获取到
IP
地址
获取IP地址 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
/**
* 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,
* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
* 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,
* 192.168.1.100
* 用户真实IP为: 192.168.1.110
* @param request
* @return
*/
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for"), unknown = "unknown";
try {
ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 使用代理,则获取第一个IP地址
if (StringUtils.isNotEmpty(ip) && ip.replace(" ", "").replace("unknown,", "").indexOf(",") > 0) {
logger.error("IP地址:{}", ip);
ip = ip.split(",")[0];
}
} catch (Exception e) {
logger.error("IPUtils getIpAddr ERROR {} ---> {}", e.getMessage(), e);
}
return getStr(ip);
}
方式二
public static String getNetIp() {
final String QUERY_ADDR_URL = "https://whois.pconline.com.cn/ipJson.jsp?json=true";
String addrStr = HttpUtil.get(QUERY_ADDR_URL);
if (!StringUtils.isEmpty(addrStr)) {
JSONObject jsonObject = JSONUtil.parseObj(addrStr);
String province = jsonObject.getStr("pro");
String city = jsonObject.getStr("city");
String addr = jsonObject.getStr("addr");
String netIp = jsonObject.getStr("ip");// 外网IP
logger.info("netIp:" + netIp + ",省份:" + province + ",城市:" + city + ",addr:" + addr);
return jsonObject;
}
return "";
}
方式三
调用
https://ip.ws.126.net/ipquery
接口获取当前的地址信息
https://ip.ws.126.net/ipquery?ip=xxx.xxx.xxx.xxx
可以获取到指定IP的位置信息
/**
* @Desc 获取省份和城市
* @return JSONObject
* @ReturnData JSONObject.get("province");
* @ReturnData JSONObject.get("city");
*/
public static JSONObject getAddress(String ip) {
String addr= HttpUtil.get(String.format("http://ip.ws.126.net/ipquery?ip=%s",ip));
if (StringUtils.isNotBlank(addr)) {
String subStr = addr.substring(addr.indexOf("{"), addr.indexOf("}") + 1);
JSONObject jsonObject = JSONUtil.parseObj(subStr );
String province = jsonObject.getStr("province");
String city = jsonObject.getStr("city");
logger.info("ip:" + ip + ",省份:" + province + ",城市:" + city);
return jsonObject;
}
return null;
}
/**
* @Desc (城市)
* @return String 城市
*/
public static String getCityByIp(String ip) {
JSONObject address = getAddress(ip);
if (!ObjectUtils.isBlank(address)) {
String city = address.getStr("city");
return city;
}
return "";
}
/**
* @Desc (省份)
* @return String 省份
*/
public static String getProvinceByIp(String ip) {
JSONObject address = getAddress(ip);
if (!ObjectUtils.isBlank(address)) {
String province = address.getStr("province");
return province;
}
return "";
}
根据IP获取对应地址
接口地址:
https://whois.pconline.com.cn/ipJson.jsp
不加参数,默认获取当前地址
加上:?json=true
https://whois.pconline.com.cn/ipJson.jsp?json=true
默认返回当前地址,数据以 JSON 格式返回
{
"ip":"115.197.199.144",
"pro":"浙江省",
"proCode":"330000",
"city":"杭州市",
"cityCode":"330100",
"region":"",
"regionCode":"0",
"addr":"浙江省杭州市 电信",
"regionNames":"",
"err":""
}
根据IP地址获取所在位置
接口地址:
https://whois.pconline.com.cn/ipJson.jsp?ip=115.204.187.230
{
"ip":"115.204.187.230",
"pro":"浙江省",
"proCode":"330000",
"city":"杭州市",
"cityCode":"330100",
"region":"",
"regionCode":"0",
"addr":"浙江省杭州市 电信",
"regionNames":"",
"err":""
}
带有经度、纬度、行政区划的地址
方式四
https://apis.map.qq.com/ws/location/v1/ip?key=自己的key
public static JSONObject getAddress(String ip,String key) {
String addr = HttpUtil.get("https://apis.map.qq.com/ws/location/v1/ip?key="+key);
if (StringUtils.isNotBlank(addr)) {
JSONObject jsonObject = JSONUtil.parseObj(addr);
return jsonObject;
}
return null;
}
方式五
https://apis.map.qq.com/ws/geocoder/v1/?key=自己的key&location=经度,纬度
// eg: "location": {"lat": 30.27415,"lng": 120.15515},
// location = 30.27415,120.15515
public static JSONObject getAddress(String location,String key) {
String addr = HttpUtil.get("https://apis.map.qq.com/ws/geocoder/v1/?key="+key+"&location="+location);
if (StringUtils.isNotBlank(addr)) {
JSONObject jsonObject = JSONUtil.parseObj(addr);
return jsonObject;
}
return null;
}
根据Request获取访问设备信息
/**
* 获取设备信息
*/
public static void getLoginData(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
UserAgent ua = UserAgent.parseUserAgentString(userAgent);
OperatingSystem os = ua.getOperatingSystem();
Browser browser = ua.getBrowser();
BrowserType browserType = browser.getBrowserType();
String browserName = browser.getName();
RenderingEngine renderingEngine = browser.getRenderingEngine();
Integer browserId = ua.getId();
String appName = os.getName();
String sessionId = request.getSession().getId();
LOGGER.info("browserType:{}", browserType); // 浏览器类型 手机浏览器还是WEB浏览器
LOGGER.info("browserName:{}", browserName); // 浏览器名称 eg:Chrome 10
LOGGER.info("browser:{}", renderingEngine.toString()); // 标志 WEBKIT
LOGGER.info("browser:{}", browserId); // 35131151
// 获取操作系统对象
LOGGER.info("设备名称:{}", appName); // 设备名称 Windows 10
}