JAVA获取地址

18 篇文章 0 订阅
18 篇文章 0 订阅

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
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值