获取ip地址
1、常量参数类
public class RequestHeader {
public static final Integer MINUS_ONE = -1;
public static final Integer ZERO = 0;
public static final Integer FIFTEEN = 15;
public final static String UNKNOWN = "unknown";
/**
* 本地ipv4地址
*/
public final static String IPV_4 = "127.0.0.1";
/**
* 本地ipv6地址
*/
public final static String IPV_6 = "0:0:0:0:0:0:0:1";
public static final String COMMA_STR = ",";
public final static String X_FORWARDED_FOR = "x-forwarded-for";
public final static String PROXY_CLIENT_IP = "Proxy-Client-IP";
public final static String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
public final static String HTTP_CLIENT_IP = "HTTP_CLIENT_IP";
public final static String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR";
public final static String CLIENT_IP = "client_ip";
}
2、获取IP方法
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
public class IpUtil {
public static String getIpAddr(HttpServletRequest request) {
String ipAddress;
try {
ipAddress = request.getHeader(RequestHeader.X_FORWARDED_FOR);
if (ipAddress == null || ipAddress.length() == RequestHeader.ZERO || RequestHeader.UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(RequestHeader.PROXY_CLIENT_IP);
}
if (ipAddress == null || ipAddress.length() == RequestHeader.ZERO || RequestHeader.UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(RequestHeader.WL_PROXY_CLIENT_IP);
}
if (ipAddress == null || ipAddress.length() == RequestHeader.ZERO || RequestHeader.UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(RequestHeader.HTTP_CLIENT_IP);
}
if (ipAddress == null || ipAddress.length() == RequestHeader.ZERO || RequestHeader.UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(RequestHeader.HTTP_X_FORWARDED_FOR);
}
if (ipAddress == null || ipAddress.length() == RequestHeader.ZERO || RequestHeader.UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(RequestHeader.CLIENT_IP);
}
if (ipAddress == null || ipAddress.length() == RequestHeader.ZERO || RequestHeader.UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if (ipAddress.equals(RequestHeader.IPV_4) || ipAddress.equals(RequestHeader.IPV_6)) {
// 根据网卡取本机配置的IP
InetAddress inet = InetAddress.getLocalHost();
ipAddress = inet.getHostAddress();
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
// "***.***.***.***".length()
if (ipAddress != null && ipAddress.length() > RequestHeader.FIFTEEN) {
// = 15
if (ipAddress.indexOf(RequestHeader.COMMA_STR) != RequestHeader.MINUS_ONE) {
ipAddress = ipAddress.substring(RequestHeader.ZERO, ipAddress.indexOf(','));
}
}
} catch (Exception e) {
ipAddress = "";
}
return ipAddress;
}
}
根据IP获取地理位置
1、引入依赖
<!-- ip2region -->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>2.6.3</version>
</dependency>
<!-- 用于读取ip2region.xdb文件使用 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2、下载文件
github地址:github.com/lionsoul201…
到github下载文件
在resource资源目录下创建ip2region, 解压后data文件夹下ip2region.xdb文件,复制到resource/ip2region资源目录下。
3、编写Java代码
import org.apache.commons.io.FileUtils;
import org.lionsoul.ip2region.xdb.Searcher;
import java.io.File;
import java.text.MessageFormat;
import java.util.Objects;
/**
* @author Dataempower6
*/
public class AddressUtil {
/**
* 当前记录地址的本地DB
*/
private static final String TEMP_FILE_DIR = "/data/test/alpha-search-jar/";
/**
* 根据IP地址查询登录来源
*
* @param ip ip
* @return 地址
*/
public static String getAddress(String ip) {
try {
// 获取当前记录地址位置的文件
String dbPath = Objects.requireNonNull(AddressUtil.class.getResource("/ip2region/ip2region.xdb")).getPath();
File file = new File(dbPath);
//如果当前文件不存在,则从缓存中复制一份
if (!file.exists()) {
dbPath = TEMP_FILE_DIR + "ip2region.xdb";
System.out.println(MessageFormat.format("当前目录为:[{0}]", dbPath));
file = new File(dbPath);
FileUtils.copyInputStreamToFile(Objects.requireNonNull(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.xdb")), file);
}
//创建查询对象
Searcher searcher = Searcher.newWithFileOnly(dbPath);
//开始查询
return searcher.searchByStr(ip);
} catch (Exception e) {
e.printStackTrace();
}
//默认返回空字符串
return "";
}
/**
* 获取城市
* @param ip ip
* @return 城市
*/
public static String getCity(String ip){
return getAddress(ip).split("\|")[3];
}
/**
* 获取详细地址
* @param ip IP
* @return 详细地址吧
*/
public static String getFullAddress(String ip){
String[] address = getAddress(ip).split("\|");
return address[0] + address[2] + address[3];
}
/**
* 获取省市区数组
* @param ip IP
* @return 省市区数组
*/
public static String[] getAddressArray(String ip){
String[] split = getAddress(ip).split("\|");
String[] address = new String[3];
address[0] = split[0];
address[1] = split[2];
address[2] = split[3];
return address;
}
}
4、执行测试
public static void main(String[] args) {
//国内IP地址 腾讯
String address = getAddress("123.129.194.14");
System.out.println(address);
//国外IP地址 谷歌
String addressG = getAddress("64.233.160.0");
System.out.println(addressG);
}
结果