IP相关工具类
2016-04-19 17:17
246 查看
import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.regex.Pattern; /** * Created by IDEA * User: mashaohua * Date: 2016-04-13 9:13 * Desc: */ public class IPUtil { /** * 获取客户端ip * */ public static String getIp(HttpServletRequest request) { String ipAddress = request.getHeader("x-forwarded-for"); if(!verifyIp(ipAddress)) { ipAddress = request.getHeader("X-Real-IP"); if(!verifyIp(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); if(!verifyIp(ipAddress)) { ipAddress = request.getHeader("WL-Proxy-Client-IP"); if(!verifyIp(ipAddress)) { ipAddress = request.getRemoteAddr(); if(ipAddress.equals("127.0.0.1")){ //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); ipAddress = inet.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } } } } } } //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if(ipAddress != null && ipAddress.length() > 15){ //"***.***.***.***".length() = 15 if(ipAddress.indexOf(",") > 0){ ipAddress = ipAddress.substring(0,ipAddress.indexOf(",")); } } return ipAddress; } private final static Pattern ipPattern = Pattern.compile("\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b"); public static boolean verifyIp(String ip) { if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) return false; return ipPattern.matcher(ip).matches(); } public static long ipToLong(String ip){ long[] array = new long[4]; int position1 = ip.indexOf("."); int position2 = ip.indexOf(".", position1 + 1); int position3 = ip.indexOf(".", position2 + 1); array[0] = Long.parseLong(ip.substring(0, position1)); array[1] = Long.parseLong(ip.substring(position1+1, position2)); array[2] = Long.parseLong(ip.substring(position2+1, position3)); array[3] = Long.parseLong(ip.substring(position3+1)); return (array[0] << 24) + (array[1] << 16) + (array[2] << 8) + array[3]; } public static String ipToString(long ip){ StringBuffer sb = new StringBuffer(""); sb.append(String.valueOf((ip >>> 24))); sb.append("."); sb.append(String.valueOf((ip & 0x00FFFFFF) >>> 16)); sb.append("."); sb.append(String.valueOf((ip & 0x0000FFFF) >>> 8)); sb.append("."); sb.append(String.valueOf((ip & 0x000000FF))); return sb.toString(); } }
相关文章推荐
- Java小程序之用*打印正/倒立三角形
- mysql--sql查询练手
- 指针运算
- iOS 点滴积累
- 每天一道算法题(六)深度优先算法(DFS)学习及Java实现
- 转:在线流程图制做网站
- sql过滤掉重复记录,只保留一条数据
- [网络流24题] 最长递增子序列 (最多不相交路径---网络最大流)
- 八皇后问题 DFS
- Quartz2D使用
- 二分递归查找数组最值
- 语音信号的端点检测的matlab代码(子带谱熵法法)
- 【机器学习】先验概率、后验概率、贝叶斯公式、 似然函数
- 调整设备时间导致的Provision过期
- 孤傲苍狼 的博客园
- ReactiveCocoa 和 MVVM 入门
- java复数矩阵运算库——Jampack
- 多线程并发编程(四):多线程同步互斥Wait/Notify
- java设计模式心得
- [总结]FFMPEG视音频编解码零基础学习方法