IPUtils.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package com.lightinit.hsdataplatform.common;
  2. import com.lightinit.hsdataplatform.json.pojo.PingResultEntity;
  3. import org.springframework.util.StringUtils;
  4. import javax.servlet.http.HttpServletRequest;
  5. import java.io.BufferedReader;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;
  12. /**
  13. * Created by Mr.Yao on 2017/5/22.
  14. */
  15. public class IPUtils {
  16. static List<String> regList=new ArrayList<String>();
  17. static {
  18. regList.add(":1");
  19. regList.add("^10\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$");
  20. regList.add("^172\\.((1[6-9]{1})|(2[0-9]{1})|(3[0-1]{1}))\\.[0-9]{1,3}\\.[0-9]{1,3}$");
  21. regList.add("^192\\.168\\.[0-9]{1,3}\\.[0-9]{1,3}$");
  22. }
  23. public static String getIpAddress(HttpServletRequest request){
  24. String ip=request.getHeader("HTTP_X_FORWARDED_FOR");
  25. if (StringUtils.isEmpty(ip)==false) {
  26. String []ipArray=ip.split(",");
  27. for (String _ip:ipArray) {
  28. if(IsPrivateIpAddress(_ip))
  29. continue;
  30. ip=_ip;
  31. break;
  32. }
  33. }
  34. if (StringUtils.isEmpty(ip)){
  35. ip = request.getRemoteAddr();
  36. }
  37. return ip;
  38. }
  39. public static boolean IsPrivateIpAddress(String ip){
  40. boolean isPrivateIp=false;
  41. for (String regIp:regList) {
  42. Pattern pattern=Pattern.compile(regIp);
  43. Matcher matcher=pattern.matcher(ip);
  44. if(matcher.matches())
  45. {
  46. isPrivateIp=true;
  47. break;
  48. }
  49. }
  50. return isPrivateIp;
  51. }
  52. public static PingResultEntity Ping(String domain,int pingTimes,String ping){
  53. PingResultEntity entity=new PingResultEntity();
  54. BufferedReader in = null;
  55. Runtime r = Runtime.getRuntime();
  56. // 将要执行的ping命令,此命令是windows格式的命令
  57. //String pingCommand = "ping " + domain + " -n " + pingTimes;
  58. String pingCommand=String.format(ping,domain,pingTimes);
  59. try {
  60. // 执行命令并获取输出
  61. System.out.println(pingCommand);
  62. Process p = r.exec(pingCommand);
  63. if (p == null) {
  64. entity.setReachable(false);
  65. }
  66. in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  67. // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
  68. int connectedCount = 0;
  69. String line = null;
  70. while ((line = in.readLine()) != null) {
  71. if(StringUtils.isEmpty(entity.getIpAddress())) {
  72. String ipLine = getIpAddress(line);
  73. if (StringUtils.isEmpty(ipLine) == false)
  74. entity.setIpAddress(ipLine);
  75. }
  76. connectedCount += getCheckWindowsResult(line)+getCheckLinuxResult(line);
  77. }
  78. // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
  79. entity.setReachable(connectedCount>0);
  80. } catch (Exception ex) {
  81. ex.printStackTrace();
  82. // 出现异常则返回假
  83. entity.setReachable(false);
  84. } finally {
  85. try {
  86. in.close();
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. }
  90. }
  91. return entity;
  92. }
  93. //若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
  94. private static int getCheckWindowsResult(String line) {
  95. // System.out.println("控制台输出的结果为:"+line);
  96. Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",Pattern.CASE_INSENSITIVE);
  97. Matcher matcher = pattern.matcher(line);
  98. while (matcher.find()) {
  99. return 1;
  100. }
  101. return 0;
  102. }
  103. //若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
  104. private static int getCheckLinuxResult(String line) {
  105. // 64 bytes from 150.138.158.3: icmp_seq=1 ttl=43 time=61.8 ms
  106. Pattern pattern = Pattern.compile("(icmp_seq=\\d+\\s+ttl=\\d+\\s+time=[0-9]{1,}([.][0-9]*)*\\s*ms)",Pattern.CASE_INSENSITIVE);
  107. Matcher matcher = pattern.matcher(line);
  108. while (matcher.find()) {
  109. return 1;
  110. }
  111. return 0;
  112. }
  113. public static String getIpAddress(String line) {
  114. // System.out.println("控制台输出的结果为:"+line);
  115. Pattern pattern = Pattern.compile("(([1-9]{1})([0-9]{0,2})\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})",Pattern.CASE_INSENSITIVE);
  116. Matcher matcher = pattern.matcher(line);
  117. while (matcher.find()) {
  118. return matcher.group();
  119. }
  120. return "";
  121. }
  122. public static String getDomain(String line) {
  123. // System.out.println("控制台输出的结果为:"+line);
  124. Pattern pattern = Pattern.compile("(([a-zA-Z0-9][a-zA-Z0-9-_]+\\.)+[a-zA-Z0-9-_][^ ]*)",Pattern.CASE_INSENSITIVE);
  125. Matcher matcher = pattern.matcher(line);
  126. while (matcher.find()) {
  127. return matcher.group();
  128. }
  129. return "";
  130. }
  131. public static boolean checkIpAddress(String targetIp,String rightIp) {
  132. if(StringUtils.isEmpty(targetIp) || StringUtils.isEmpty(rightIp))
  133. return false;
  134. String []rightIps=rightIp.split(";");
  135. for (String ip:rightIps) {
  136. if(targetIp.trim().equalsIgnoreCase(ip.trim()))
  137. return true;
  138. }
  139. return false;
  140. }
  141. }