获取IP地址,根据IP解析位置

165 阅读2分钟

获取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下载文件 image.png

在resource资源目录下创建ip2region, 解压后data文件夹下ip2region.xdb文件,复制到resource/ip2region资源目录下。

image.png

image.png

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);
}

结果

image.png