工具类分享之《IpUtil》
来源:互联网 发布:淘宝主营行业 编辑:程序博客网 时间:2024/05/02 17:19
前言
在企业开发中获取IP地址是个常见的使用,今天给大家分享个获取IP的工具类,希望能在开发中帮助到你,代码注释写的还算详细,这里就不在多说了。
代码实现
package com.zhuma.demo.util;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.UnknownHostException;import java.util.Enumeration;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * @desc IP操作工具类 * * @author zhumaer * @since 6/20/2017 16:37 PM */public class IpUtil { private static final Logger LOGGER = LoggerFactory.getLogger(AESUtil.class); private static final String ipPattern = "^(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\b"; /** * @Description: 获取请求中的ip地址:过了多级反向代理,获取的ip不是唯一的,二是包含中间代理层ip。 * * @return 可能有多个,例如:192.168.1.110, 192.168.1.120 */ public static String getIpAddr(HttpServletRequest request) { String ip = "127.0.0.1"; if (request != null) { ip = request.getHeader("x-forwarded-for"); if (StringUtil.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (StringUtil.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtil.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } return ip; } /** * * @Description: 获取客户端请求中的真实的ip地址 * * 获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。 * 但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址。而且,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个, * 而是一串ip值,例如:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100。其中第一个192.168.1.110才是用户真实的ip */ public static String getRealIp(HttpServletRequest request) { String ip = "127.0.0.1"; if (request == null) { return ip; } 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("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if (ip.equals("127.0.0.1") || ip.equals("0:0:0:0:0:0:0:1")) { //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); ip = inet.getHostAddress(); } catch (UnknownHostException e) { LOGGER.error("getRealIp occurs error, caused by: ", e); } } } if (ip != null && ip.length() > 15) { //"***.***.***.***".length() = 15 if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } return ip; } /** * 获取服务器IP */ public static String getServiceIp() { Enumeration<NetworkInterface> netInterfaces = null; String ipsStr = ""; try { netInterfaces = NetworkInterface.getNetworkInterfaces(); while (netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); Enumeration<InetAddress> ips = ni.getInetAddresses(); Pattern pattern = Pattern.compile(ipPattern); while (ips.hasMoreElements()) { String ip = ips.nextElement().getHostAddress(); Matcher matcher = pattern.matcher(ip); if (matcher.matches() && !ip.equals("127.0.0.1")) { ipsStr = ip; } } } } catch (Exception e) { LOGGER.error("getServiceIp occurs error, caused by: ", e); } return ipsStr; }}
欢迎关注我们的公众号或加群,等你哦!
阅读全文
0 0
- 工具类分享之《IpUtil》
- 【java工具类】IPUtil
- IPUtil 工具类总结
- ip处理工具类IPUtil
- IPUtil工具类,java 获取IP所属地
- IpUtil
- IPUtil
- 工具类分享之《JsonUtil》
- JAVA工具类(6)---IPUtil工具类(获取window与linux的本地ip及客户端ip)
- IPUtil类---获取登录用户IP地址
- Android分享之Log工具类
- Android分享之时间日期转换工具类DateTime
- 日期工具类分享
- Android 分享工具类
- Jedis工具类分享
- ShareSdk分享工具类
- [笔记分享] [SCons] SCons工具之Overview
- [笔记分享] [SCons] SCons工具之Build
- Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动
- C++通过Api操作MySQL
- 深信服2018校园招聘C++工程师编程题
- centos ONBOOT 为啥设置yes原因
- 解决问题:编译Latex遇到File ended while scanning use of \@newl@bel.
- 工具类分享之《IpUtil》
- Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析
- 【ccf201709-4】通信网络
- 不疯魔,不成活
- HttpServlet(五)
- Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap
- 【练习】邻接表法创建图
- python_re
- layout目录下写好的xml文件用的时候找不到