|
|
@@ -3,6 +3,7 @@ package com.ruoyi.common.core.utils.ip;
|
|
3
|
3
|
import java.net.InetAddress;
|
|
4
|
4
|
import java.net.UnknownHostException;
|
|
5
|
5
|
import javax.servlet.http.HttpServletRequest;
|
|
|
6
|
+import com.ruoyi.common.core.utils.ServletUtils;
|
|
6
|
7
|
import com.ruoyi.common.core.utils.StringUtils;
|
|
7
|
8
|
|
|
8
|
9
|
/**
|
|
|
@@ -12,6 +13,23 @@ import com.ruoyi.common.core.utils.StringUtils;
|
|
12
|
13
|
*/
|
|
13
|
14
|
public class IpUtils
|
|
14
|
15
|
{
|
|
|
16
|
+ public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
|
|
|
17
|
+ // 匹配 ip
|
|
|
18
|
+ public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
|
|
|
19
|
+ public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
|
|
|
20
|
+ // 匹配网段
|
|
|
21
|
+ public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
|
|
|
22
|
+
|
|
|
23
|
+ /**
|
|
|
24
|
+ * 获取客户端IP
|
|
|
25
|
+ *
|
|
|
26
|
+ * @return IP地址
|
|
|
27
|
+ */
|
|
|
28
|
+ public static String getIpAddr()
|
|
|
29
|
+ {
|
|
|
30
|
+ return getIpAddr(ServletUtils.getRequest());
|
|
|
31
|
+ }
|
|
|
32
|
+
|
|
15
|
33
|
/**
|
|
16
|
34
|
* 获取客户端IP
|
|
17
|
35
|
*
|
|
|
@@ -248,7 +266,7 @@ public class IpUtils
|
|
248
|
266
|
}
|
|
249
|
267
|
}
|
|
250
|
268
|
}
|
|
251
|
|
- return ip;
|
|
|
269
|
+ return StringUtils.substring(ip, 0, 255);
|
|
252
|
270
|
}
|
|
253
|
271
|
|
|
254
|
272
|
/**
|
|
|
@@ -261,4 +279,104 @@ public class IpUtils
|
|
261
|
279
|
{
|
|
262
|
280
|
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
|
|
263
|
281
|
}
|
|
|
282
|
+
|
|
|
283
|
+ /**
|
|
|
284
|
+ * 是否为IP
|
|
|
285
|
+ */
|
|
|
286
|
+ public static boolean isIP(String ip)
|
|
|
287
|
+ {
|
|
|
288
|
+ return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
|
|
|
289
|
+ }
|
|
|
290
|
+
|
|
|
291
|
+ /**
|
|
|
292
|
+ * 是否为IP,或 *为间隔的通配符地址
|
|
|
293
|
+ */
|
|
|
294
|
+ public static boolean isIpWildCard(String ip)
|
|
|
295
|
+ {
|
|
|
296
|
+ return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
|
|
|
297
|
+ }
|
|
|
298
|
+
|
|
|
299
|
+ /**
|
|
|
300
|
+ * 检测参数是否在ip通配符里
|
|
|
301
|
+ */
|
|
|
302
|
+ public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip)
|
|
|
303
|
+ {
|
|
|
304
|
+ String[] s1 = ipWildCard.split("\\.");
|
|
|
305
|
+ String[] s2 = ip.split("\\.");
|
|
|
306
|
+ boolean isMatchedSeg = true;
|
|
|
307
|
+ for (int i = 0; i < s1.length && !s1[i].equals("*"); i++)
|
|
|
308
|
+ {
|
|
|
309
|
+ if (!s1[i].equals(s2[i]))
|
|
|
310
|
+ {
|
|
|
311
|
+ isMatchedSeg = false;
|
|
|
312
|
+ break;
|
|
|
313
|
+ }
|
|
|
314
|
+ }
|
|
|
315
|
+ return isMatchedSeg;
|
|
|
316
|
+ }
|
|
|
317
|
+
|
|
|
318
|
+ /**
|
|
|
319
|
+ * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
|
|
|
320
|
+ */
|
|
|
321
|
+ public static boolean isIPSegment(String ipSeg)
|
|
|
322
|
+ {
|
|
|
323
|
+ return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
|
|
|
324
|
+ }
|
|
|
325
|
+
|
|
|
326
|
+ /**
|
|
|
327
|
+ * 判断ip是否在指定网段中
|
|
|
328
|
+ */
|
|
|
329
|
+ public static boolean ipIsInNetNoCheck(String iparea, String ip)
|
|
|
330
|
+ {
|
|
|
331
|
+ int idx = iparea.indexOf('-');
|
|
|
332
|
+ String[] sips = iparea.substring(0, idx).split("\\.");
|
|
|
333
|
+ String[] sipe = iparea.substring(idx + 1).split("\\.");
|
|
|
334
|
+ String[] sipt = ip.split("\\.");
|
|
|
335
|
+ long ips = 0L, ipe = 0L, ipt = 0L;
|
|
|
336
|
+ for (int i = 0; i < 4; ++i)
|
|
|
337
|
+ {
|
|
|
338
|
+ ips = ips << 8 | Integer.parseInt(sips[i]);
|
|
|
339
|
+ ipe = ipe << 8 | Integer.parseInt(sipe[i]);
|
|
|
340
|
+ ipt = ipt << 8 | Integer.parseInt(sipt[i]);
|
|
|
341
|
+ }
|
|
|
342
|
+ if (ips > ipe)
|
|
|
343
|
+ {
|
|
|
344
|
+ long t = ips;
|
|
|
345
|
+ ips = ipe;
|
|
|
346
|
+ ipe = t;
|
|
|
347
|
+ }
|
|
|
348
|
+ return ips <= ipt && ipt <= ipe;
|
|
|
349
|
+ }
|
|
|
350
|
+
|
|
|
351
|
+ /**
|
|
|
352
|
+ * 校验ip是否符合过滤串规则
|
|
|
353
|
+ *
|
|
|
354
|
+ * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
|
|
|
355
|
+ * @param ip 校验IP地址
|
|
|
356
|
+ * @return boolean 结果
|
|
|
357
|
+ */
|
|
|
358
|
+ public static boolean isMatchedIp(String filter, String ip)
|
|
|
359
|
+ {
|
|
|
360
|
+ if (StringUtils.isEmpty(filter) && StringUtils.isEmpty(ip))
|
|
|
361
|
+ {
|
|
|
362
|
+ return false;
|
|
|
363
|
+ }
|
|
|
364
|
+ String[] ips = filter.split(";");
|
|
|
365
|
+ for (String iStr : ips)
|
|
|
366
|
+ {
|
|
|
367
|
+ if (isIP(iStr) && iStr.equals(ip))
|
|
|
368
|
+ {
|
|
|
369
|
+ return true;
|
|
|
370
|
+ }
|
|
|
371
|
+ else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
|
|
|
372
|
+ {
|
|
|
373
|
+ return true;
|
|
|
374
|
+ }
|
|
|
375
|
+ else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
|
|
|
376
|
+ {
|
|
|
377
|
+ return true;
|
|
|
378
|
+ }
|
|
|
379
|
+ }
|
|
|
380
|
+ return false;
|
|
|
381
|
+ }
|
|
264
|
382
|
}
|