Java获取客户端信息以及IP地址

 更新时间:2024年02月03日 10:16:54   作者:哪里的破水瓶  
这篇文章主要为大家详细介绍了如何使用Java获取客户端信息以及IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

获取客户端的信息

<dependency>
    <groupId>eu.bitwalker</groupId>
    <artifactId>UserAgentUtils</artifactId>
</dependency>
// 获取 http 请求类  
HttpServletRequest httpServletRequest = ServletUtils.getRequest();  
// 获取客户端信息  
String header = httpServletRequest.getHeader("User-Agent");  
// 解析客户端信息  
final UserAgent userAgent = UserAgent.parseUserAgentString(header);

// 获取客户端操作系统
String os = userAgent.getOperatingSystem().getName();
// 获取客户端浏览器
String browser = userAgent.getBrowser().getName();

获取IP地址

/**
 * 获取客户端IP地址
 *
 * @param request HttpServletRequest对象
 * @return 客户端IP地址
 */
public static String getIpAddr(HttpServletRequest request) {
    if (request == null) return "unknown";
    // 从HTTP请求头中获取代理服务器传递的客户端IP地址
    String ip = request.getHeader("x-forwarded-for");
    // 若未获取到,尝试其他可能的头信息----用于比较两个字符串是否相等,而且不区分大小写
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("X-Forwarded-For");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("X-Real-IP");
    }
    // 若仍未获取到,使用远程地址
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }
    // 处理IPv6本地回环地址
    // EscapeUtil.clean(ip) 清除HTML标签,保留内容
    return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : EscapeUtil.clean(ip);
}

也可以引入 Hutool

String ip = ServletUtil.getClientIP(request);

判断是否是内部 ip

/**
 * 判断 ip 是否是内部 ip
 * @param ip ip
 * @return true 是内部,false 不是
 */
public static boolean internalIp(String ip) {
    byte[] addr = textToNumericFormatV4(ip);
    return internalIp(addr) || "127.0.0.1".equals(ip);
}

private static boolean internalIp(byte[] addr) {
    if (StringUtils.isNull(addr) || addr.length < 2) {
        return true;
    }
    final byte b0 = addr[0];
    final byte b1 = addr[1];
    // 10.x.x.x/8
    final byte SECTION_1 = 0x0A;
    // 172.16.x.x/12
    final byte SECTION_2 = (byte) 0xAC;
    final byte SECTION_3 = (byte) 0x10;
    final byte SECTION_4 = (byte) 0x1F;
    // 192.168.x.x/16
    final byte SECTION_5 = (byte) 0xC0;
    final byte SECTION_6 = (byte) 0xA8;
    switch (b0) {
        case SECTION_1:
            return true;
        case SECTION_2:
            if (b1 >= SECTION_3 && b1 <= SECTION_4) return true;
        case SECTION_5:
            if (b1 == SECTION_6) return true;
        default:
            return false;
    }
}

/**
 * 将IPv4地址转换成字节
 *
 * @param text IPv4地址
 * @return byte 字节
 */
public static byte[] textToNumericFormatV4(String text) {
    if (text.length() == 0) return null;

    byte[] bytes = new byte[4];
    String[] elements = text.split("\\.", -1);
    try {
        long l;
        int i;
        switch (elements.length) {
            case 1:
                l = Long.parseLong(elements[0]);
                if ((l < 0L) || (l > 4294967295L)) {
                    return null;
                }
                bytes[0] = (byte) (int) (l >> 24 & 0xFF);
                bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
                bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                bytes[3] = (byte) (int) (l & 0xFF);
                break;
            case 2:
                l = Integer.parseInt(elements[0]);
                if ((l < 0L) || (l > 255L)) {
                    return null;
                }
                bytes[0] = (byte) (int) (l & 0xFF);
                l = Integer.parseInt(elements[1]);
                if ((l < 0L) || (l > 16777215L)) {
                    return null;
                }
                bytes[1] = (byte) (int) (l >> 16 & 0xFF);
                bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                bytes[3] = (byte) (int) (l & 0xFF);
                break;
            case 3:
                for (i = 0; i < 2; ++i) {
                    l = Integer.parseInt(elements[i]);
                    if ((l < 0L) || (l > 255L)) {
                        return null;
                    }
                    bytes[i] = (byte) (int) (l & 0xFF);
                }
                l = Integer.parseInt(elements[2]);
                if ((l < 0L) || (l > 65535L)) {
                    return null;
                }
                bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                bytes[3] = (byte) (int) (l & 0xFF);
                break;
            case 4:
                for (i = 0; i < 4; ++i) {
                    l = Integer.parseInt(elements[i]);
                    if ((l < 0L) || (l > 255L)) {
                        return null;
                    }
                    bytes[i] = (byte) (int) (l & 0xFF);
                }
                break;
            default:
                return null;
        }
    } catch (NumberFormatException e) {
        return null;
    }
    return bytes;
}

Hutool

boolean innerIP = NetUtil.isInnerIP(ip);

到此这篇关于Java获取客户端信息以及IP地址的文章就介绍到这了,更多相关Java获取客户端IP地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue数字相加、相减精度丢失处理3种方法

    Vue数字相加、相减精度丢失处理3种方法

    这篇文章主要给大家介绍了关于Vue数字相加、相减精度丢失处理3种方法的相关资料,前端在操作加减乘除计算时,经常会出现精度缺失问题,有时会显示为科学计数的样式,需要的朋友可以参考下
    2023-08-08
  • Vue.config.js配置报错ValidationError: Invalid options object解决办法

    Vue.config.js配置报错ValidationError: Invalid options object解

    这篇文章主要给大家介绍了关于Vue.config.js配置报错ValidationError: Invalid options object的解决办法,主要由于vue.config.js配置文件错误导致的,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Vue使用axios进行数据异步交互的方法

    Vue使用axios进行数据异步交互的方法

    大家都知道在Vue里面有两种出名的插件能够支持发起异步数据传输和接口交互,分别是axios和vue-resource,同时vue更新到2.0之后,宣告不再对vue-resource更新,而是推荐的axios,今天就讲一下怎么引入axios,需要的朋友可以参考下
    2024-01-01
  • vue-cli3+ts+webpack实现多入口多出口功能

    vue-cli3+ts+webpack实现多入口多出口功能

    这篇文章主要介绍了vue-cli3+ts+webpack实现多入口多出口功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • vue2.0+elementui实现一个上门取件时间组件

    vue2.0+elementui实现一个上门取件时间组件

    这篇文章主要给大家介绍了关于vue2.0+elementui实现一个上门取件时间组件的相关资料,用于预约上门服务时间 看到网上有很多乱七八糟的代码,看着头疼,于是自己写了一个简单的,需要的朋友可以参考下
    2024-02-02
  • Vue-router中path的设置方式

    Vue-router中path的设置方式

    这篇文章主要介绍了Vue-router中path的设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Vue CLI4 Vue.config.js标准配置(最全注释)

    Vue CLI4 Vue.config.js标准配置(最全注释)

    这篇文章主要介绍了Vue CLI4 Vue.config.js标准配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • vuedraggable+element ui实现页面控件拖拽排序效果

    vuedraggable+element ui实现页面控件拖拽排序效果

    这篇文章主要为大家详细介绍了vuedraggable+element ui实现页面控件拖拽排序效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • vue-resource拦截器设置头信息的实例

    vue-resource拦截器设置头信息的实例

    下面小编就为大家带来一篇vue-resource拦截器设置头信息的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • vuex实现数据状态持久化

    vuex实现数据状态持久化

    今天小编就为大家分享一篇vuex实现数据状态持久化,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论