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中至关重要的协议,主要负责将 ...
随机推荐
- 14.SpringMVC核心技术-类型转换器
类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. ...
- wordpress程序打开太慢的解决方案(一步搞定)
周末两天没有打开自己的赵一鸣随笔博客,今天访问了一下,打开速度太慢了,看看浏览器栏目,网站标题已经显示出来了,但是网页却是一片空白,什么都没有,刚开始以为是我们公司网速的问题,就没有特别注意这件事情. ...
- STM32——CAN总线过滤器设置
STM32CAN控制器每个筛选器组由两个32位的寄存器组成. 根据所需位宽的不同,各个筛选器可配置成16位或32位模式(如下图,当FSCx=1为32位模式,FSCx=0时为16位模式).同时,筛选器的 ...
- 《Linux就该这么学》day4-6
继续学习打卡,这几天有事所以看视频补上了这几天的学习进度. day4:主要重点 tar打包和解压命令 tar -zxvf xxx.tar.gz 解压xxx.tar.gz (将xxx.tar.gz ...
- java——多线程并发库
JDK5中增加了Doug Lea的并发库,这一引进给Java线程的管理和使用提供了强大的便利性. java.util.current包中提供了对线程优化.管理的各项操作,使得线程的使用变得的心应手.该 ...
- C# 接口的作用浅谈举例(转)
转:http://blog.csdn.net/liuqinghui1990/article/details/77171051 我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含 ...
- 洛谷P4983 忘情 (WQS二分+斜率优化)
题目链接 忘情水二分模板题,最优解对划分段数的导数满足单调性(原函数凸性)即可使用此方法. 详细题解洛谷里面就有,不啰嗦了. 二分的临界点让人有点头大... #include<bits/stdc ...
- P5074 Eat the Trees
思路 同样是插头DP,但是这题因为可以形成多个回路,所以左右括号是没有区别的,只需要01就可以表示了 注意if的嵌套关系 注意全零矩阵也要输出1 代码 #include <cstdio> ...
- 如何创建vue项目
Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...
- Java8-Stream-No.05
import java.util.Arrays; import java.util.List; import java.util.function.Supplier; import java.util ...