zoukankan      html  css  js  c++  java
  • ip获取工具类197

    ip获取工具类



    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import javax.servlet.http.HttpServletRequest;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.util.Enumeration;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    /**
    * @Title: IPUtil
    * @Package com.ds.platform.base.util
    * @Description:
    * @author ds
    * @date 2018/5/28
    */
    public class IPUtil {
    private final static Logger logger = LoggerFactory.getLogger(IPUtil.class);
    public static final Pattern DB_URL_PATTERN = Pattern.compile("jdbc:mysql://(.*):([\d]*)/(.*)\?");
    /**
    * 获得远程用户真实IP地址
    * @param request
    * @return
    */
    public static String getClientIP(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for");
    if (isIpUnKnown(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
    }
    if (isIpUnKnown(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (isIpUnKnown(ip)) {
    ip = request.getRemoteAddr();
    }
    return ip;
    }

    /**
    * 判断是否时unknown
    * @param ip
    * @return
    */
    private static boolean isIpUnKnown(String ip){
    return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip);
    }

    /**
    * 获取客户端IP地址
    * @param request
    * @return
    */
    public static String getClientIpAddr(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_CLIENT_IP");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_FORWARDED_FOR");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_FORWARDED");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("HTTP_VIA");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getHeader("REMOTE_ADDR");
    }
    if(isIpUnKnown(ip)) {
    ip = request.getRemoteAddr();
    }
    return ip;
    }

    /**
    * 获取本机的IP 地址
    * @return
    * @throws Exception
    */
    public static String getLocalHostLANAddress() {
    try {
    InetAddress candidateAddress = null;
    // 遍历所有的网络接口
    for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); ) {
    NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
    // 在所有的接口下再遍历IP
    for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) {
    InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
    if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
    if (inetAddr.isSiteLocalAddress()) {
    // 如果是site-local地址,就是它了
    return inetAddr.getHostAddress();
    } else if (candidateAddress == null) {
    // site-local类型的地址未被发现,先记录候选地址
    candidateAddress = inetAddr;
    }
    }
    }
    }
    if (candidateAddress != null) {
    return candidateAddress.getHostAddress();
    }
    // 如果没有发现 non-loopback地址.只能用最次选的方案
    InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
    return jdkSuppliedAddress.getHostAddress();
    } catch (Exception e) {
    logger.error("读取本机IP失败,原因:{}",e.getMessage());
    }
    return "";
    }

    /**
    * 根据mysql的url连接解析出IP 端口 和数据库名称
    * @param url
    * @return
    */
    public static DBConnInfo parseMysqlUrlIP(String url){
    DBConnInfo dbConnInfo = new DBConnInfo();
    Matcher matcher = DB_URL_PATTERN.matcher(url);
    while(matcher.find()){
    dbConnInfo.setIp(matcher.group(1));
    dbConnInfo.setPort(matcher.group(2));
    dbConnInfo.setDbName(matcher.group(3));
    }
    return dbConnInfo;
    }

    public static class DBConnInfo{
    private String ip;
    private String port;
    private String dbName;
    public DBConnInfo(){}
    public DBConnInfo(String ip, String port, String dbName) {
    this.ip = ip;
    this.port = port;
    this.dbName = dbName;
    }

    public String getIp() {
    return ip;
    }

    public void setIp(String ip) {
    this.ip = ip;
    }

    public String getPort() {
    return port;
    }

    public void setPort(String port) {
    this.port = port;
    }

    public String getDbName() {
    return dbName;
    }

    public void setDbName(String dbName) {
    this.dbName = dbName;
    }
    }
    }
  • 相关阅读:
    StringBuffer与StringBuilder的区别比较
    JAVA数据结构--快速排序
    JAVA数据结构--优先队列(堆实现)
    JAVA数据结构--哈希表的实现(分离链接法)
    JAVA数据结构--AVL树的实现
    JAVA数据结构--二叉查找树
    JAVA普通内部类的用法
    关于JAVA泛型中的通配符类型
    JAVA泛型方法与类型限定
    Linux进程间通信的几种方式
  • 原文地址:https://www.cnblogs.com/Ai-Hen-Jiao-zhi/p/13803841.html
Copyright © 2011-2022 走看看