ip效验和ip段的效验
package com.juchen.utils; import javax.servlet.http.HttpServletRequest; /**
* ip 相关的工具方法
*/
public class IpUtil { /* *//**
* 根据request获取用户的IP地址
* @param request
* @return
*/
public static String getRemoteHost(HttpServletRequest request){
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("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;
} /**
*
* @param request
* @return 192.168.1.121 192.168.1.121,192.168.1.122
*/
public static String getIpAddress(HttpServletRequest request){
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
String ip = "192.168.0.1";
try { 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.getHeader("X-Real-IP");
} //如果没有代理,则获取真实ip
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
} if(ip.equals("0:0:0:0:0:0:0:1")){
ip = "127.0.0.1";
} } catch (Exception e) {
ip = "192.168.0.1";
} return ip;
} /*
* 验证IP是否属于某个IP段
*
*
*
* ipSection IP段(以'-'分隔)
*
* ip 所验证的IP号码
*
*
*
*/ public static boolean ipExistsInRange(String ip, String ipSection) {
ipSection = ipSection.trim();
ip = ip.trim();
int idx = ipSection.indexOf('-');
String beginIP = ipSection.substring(0, idx);
String endIP = ipSection.substring(idx + 1);
return getIp2long(beginIP) <= getIp2long(ip) && getIp2long(ip) <= getIp2long(endIP);
} public static long getIp2long(String ip) {
ip = ip.trim();
String[] ips = ip.split("\\.");
long ip2long = 0L;
for (int i = 0; i < 4; ++i) {
ip2long = ip2long << 8 | Integer.parseInt(ips[i]);
}
return ip2long;
} public static long getIp2long2(String ip) {
ip = ip.trim();
String[] ips = ip.split("\\.");
long ip1 = Integer.parseInt(ips[0]);
long ip2 = Integer.parseInt(ips[1]);
long ip3 = Integer.parseInt(ips[2]);
long ip4 = Integer.parseInt(ips[3]);
long ip2long = 1L * ip1 * 256 * 256 * 256 + ip2 * 256 * 256 + ip3 * 256 + ip4;
return ip2long;
} public static void main(String[] args){ //10.10.10.116 是否属于固定格式的IP段10.10.1.00-10.10.255.255 String ip="10.8.12.255"; String ipSection="10.1.1.00-10.10.10.250"; boolean exists=ipExistsInRange(ip,ipSection); System.out.println(exists); System.out.println(getIp2long(ip)); System.out.println(getIp2long2(ip)); } }
自己的业务是支持多个单个ip和多个ip段 例如 192.168.0.1-192.168.0.100,10.10.10.1-10.10.10.100;170.20.20.100
public static void main(String[] args) {
String ip = "192.168.10.10,255.168.100.255;192.168.0.1-192.168.3.100,192.168.5.1-192.168.5.100";
String remoteHost = "192.168.255.88,192.168.10.11";
checkIp(ip, remoteHost);
}
/**
*
* @param ip 用户填写可以通过的ip或ip段(可能存在多个或两种都存在)
* @param remoteHost 这个是抓取到的ip (可能存在多个)
* @return
*/
public static boolean checkIp(String ip, String remoteHost) {
// IP地址校验
boolean flag = false;
if (!StringUtil.isEmpty(ip)) {
String[] remoteHostList = remoteHost.split(",");
// 新增短信ip段的效验
String[] ipArry = ip.split(";");
for (int i = 0; i < remoteHostList.length; i++) {
if (DateConfig.server_ip.indexOf(remoteHostList[i].trim()) > -1) {
flag = true;
break;
} else {
if (ip.indexOf(remoteHostList[i].trim()) > -1) {
flag = true;
break;
}
// 判断ip段
for (String ipStr : ipArry) {
if (ipStr.indexOf("-") != -1) { // 包含ip段
String[] ipSegent = ipStr.split(",");
for (String strs : ipSegent) { // str 192.168.0.1 -192.168.0.100
boolean ipfalg = IpUtil.ipExistsInRange(remoteHostList[i].trim(), strs.trim());
if (ipfalg) {
flag = true;
break;
}
}
}
}
}
}
if (!flag) {
System.out.println("ip效验不通过");
}else{
System.out.println("ip效验通过");
}
}
return flag;
}
上面效验ip是否在ip段的短发里面转载自:https://blog.csdn.net/qq_14918243/article/details/51452489
ip效验和ip段的效验的更多相关文章
- Scan IP relocate/failover其它段后不能ping通过
或手动集群重启单个节点srvctl relocate scan_listener后.群集网络段ping IP,VIP.SCAN IP正常.其他段ping SCAN IP 不通.其原因是,该路由ARP表 ...
- [LeetCode] Validate IP Address 验证IP地址
In this problem, your job to write a function to check whether a input string is a valid IPv4 addres ...
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- Nginx禁止ip访问或IP网段访问方法
Nginx禁止ip访问可以防止指定IP访问我们的网站,本例子可以实现是防止单IP访问或IP网段访问了,非常的有用我们一起来看看吧. 常用的linux做法 iptables参考规则 代码如下 复制代码 ...
- Linux防火墙:iptables禁IP与解封IP常用命令
在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...
- 公有IP与私有IP
在 IPv4 里面就只有两种 IP 的类别,分别是: Public IP : 公共 IP ,经由 INTERNIC 所统一规划的 IP,有这种 IP 才可以连上 Internet : Private ...
- C#获取本机IP以及无线网ip
1 private void GetIP() 2 { 3 string hostName = Dns.GetHostName();//本机名 4 //System.Net.IPAddress ...
- TCP/IP——内外网IP+子网掩码作用+PING(网络总结)
目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...
- TCP/IP笔记(四)IP协议
前言 IP相当于OSI参考模型的第3层--网络层:主要作用是"实现终端节点之间的通信"又称"点对点通信". IP作为整个TCP/IP中至关重要的协议,主要负责将 ...
随机推荐
- mysql 按月统计但是有几个月没有数据,需要变成0
创建现在倒过去的12个月的视图 CREATE VIEW `past_12_month_view` AS SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS `month ...
- c++ 二叉树的遍历(迭代,递归)
#include<iostream> #include <algorithm> #include <vector> #include <set> #in ...
- Hadoop_15_MapRduce_案例1_Wordcount 单词统计
1.Wordcount示例编写: MapReduce采用”分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各 个节点的中间结果,得到最终结果.简单地说 ...
- Linux磁盘及文件系统管理4
文件系统的使用: 首先要“挂载”:mount命令和umount命令 根据文件系统之外的其它文件系统要想能够被访问,都必须通过“关联”到根文件系统上的某个目录来实现,此关联操作即为“挂载”:此目录即为“ ...
- Python3+Appium学习笔记01-环境配置(上)
公司可能也有关于对app自动化的一些想法,让我去研究下.当然以移动互联网的热度.对于app自动化测试技术听闻已久.也一直想要去学习.正好.这次可以在工作时间中学习.emmm.希望自己能坚持把这个系列更 ...
- mybatis的配置文件详解(二)
一.properties 这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递.例如 1) <?xml versio ...
- cmake学习笔记之add_library、target_link_libraries和link_directories
cmake是Linux(这里默认是Ubuntu系统)下常使用的编译C++的工具,而使用cmake就需要先在CmakeLists.txt文件中对编译规则进行.这里介绍常用的三种指令add_library ...
- FFmpeg常用命令学习笔记(三)分解/复用命令
分解/复用命令 比如文件格式的转换.将封装格式文件中的音频与视频文件分别抽取出来等. 多媒体格式的转换(将MP4文件转成flv格式) ffmpeg -i yan.mp4 -vcodec copy -a ...
- 集合(一)-Java中Arrays.sort()自定义数组的升序和降序排序
默认升序 package peng; import java.util.Arrays; public class Testexample { public static void main(Stri ...
- lnmp配置
yum源切换 下载wegt工具 yum install -y wget 备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS- ...