springboot 日志采样率,springboot整合GeoLite2实现IP转经纬度
springboot 日志采样率,springboot整合GeoLite2实现IP转经纬度下载地址:https://www.maxmind.com/en/accounts/561549/geoip/downloads通过GeoLite2,Java根据IP获得城市、经纬度。地图飞线或者坐标点的展示都是通过经纬度进行设置的,如果拿不到对应的经纬度则无法对地图攻击来源进行演示。为此查找方案,可以通过IP对经纬度的转换来实现攻击的展现(坐标点存在误差,非精确经纬度)。通过输入一个IP地址,解析并获取信息,比如国家、国家代码、省份、省份代码、城市、邮政编码、经纬度等等信息三方在线地址:ip-api.com
今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您。
架构开源地址:https://gitee.com/msxy
评论转发
业务场景在实际的业务中,涉及到攻防数据的演示,但是基础的数据只有攻击的IP,如何在地图上展示攻击的来源?
地图飞线或者坐标点的展示都是通过经纬度进行设置的,如果拿不到对应的经纬度则无法对地图攻击来源进行演示。为此查找方案,可以通过IP对经纬度的转换来实现攻击的展现(坐标点存在误差,非精确经纬度)。
在线IP获取地区通过输入一个IP地址,解析并获取信息,比如国家、国家代码、省份、省份代码、城市、邮政编码、经纬度等等信息
三方在线地址:ip-api.com
GeoLite2 数据库下载通过GeoLite2,Java根据IP获得城市、经纬度。
下载地址:https://www.maxmind.com/en/accounts/561549/geoip/downloads
因为我需要获取城市信息,所以选择第三个,压缩包大概30MB,解压后里面的 mmdb 有60MB
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.13.1</version>
</dependency>
2、实现工具类
package com.qingfeng.common.controller;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import javax.servlet.http.HttpServletRequest;
import com.maxmind.geoip2.DatabaseReader;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @ProjectName IpGeoUtils
* @author Administrator
* @version 1.0.0
* @Description 获取客户端IP地址
* @createTime 2021/6/3 14:29
*/
public class IpGeoUtils {
private static Logger logger = LoggerFactory.getLogger(IpGeoUtils.class);
/**
* 获取客户端IP地址
*
* 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
*/
public static String getIP(HttpServletRequest request) {
String ip = null;
try {
ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || "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.getRemoteAddr();
}
} catch (Exception e) {
logger.error("IPUtils ERROR " e);
}
return ip;
}
/**
*
* @description: 获得国家
* @param reader
* @param ip
* @return
* @throws Exception
*/
public static String getCountry(DatabaseReader reader String ip) throws Exception {
return reader.city(InetAddress.getByName(ip)).getCountry().getNames().get("zh-CN");
}
/**
*
* @description: 获得省份
* @param reader
* @param ip
* @return
* @throws Exception
*/
public static String getProvince(DatabaseReader reader String ip) throws Exception {
return reader.city(InetAddress.getByName(ip)).getMostSpecificSubdivision().getNames().get("zh-CN");
}
/**
*
* @description: 获得城市
* @param reader
* @param ip
* @return
* @throws Exception
*/
public static String getCity(DatabaseReader reader String ip) throws Exception {
return reader.city(InetAddress.getByName(ip)).getCity().getNames().get("zh-CN");
}
/**
*
* @description: 获得经度
* @param reader
* @param ip
* @return
* @throws Exception
*/
public static Double getLongitude(DatabaseReader reader String ip) throws Exception {
// return reader.city(InetAddress.getByName(ip)).getLocation().getLongitude();
double data = 0;
try {
data = reader.city(InetAddress.getByName(ip)).getLocation().getLongitude();
}catch (Exception e){
}
return data;
}
/**
*
* @description: 获得纬度
* @param reader
* @param ip
* @return
* @throws Exception
*/
public static Double getLatitude(DatabaseReader reader String ip){
double data = 0;
try {
data = reader.city(InetAddress.getByName(ip)).getLocation().getLatitude();
}catch (Exception e){
}
return data;
}
public static void main(String[] args) throws Exception {
// String path = req.getSession().getServletContext().getRealPath("/WEB-INF/classes/GeoLite2-City.mmdb");
String path = "D:/java/GeoLite2-City/GeoLite2-City.mmdb";
// 创建 GeoLite2 数据库
File database = new File(path);
// 读取数据库内容
DatabaseReader reader = new DatabaseReader.Builder(database).build();
// 访问IP
String ip = "28.16.2.122";
String site = IpGeoUtils.getCountry(reader ip) "-" IpGeoUtils.getLongitude(reader ip) "-" IpGeoUtils.getLatitude(reader ip);
System.out.println(site);
Double lon = IpGeoUtils.getLongitude(reader ip);
double lat = IpGeoUtils.getLatitude(reader ip);
System.out.println("Lon:" lon "---Lat:" lat);
}
}