JAVA获取本机IP地址

原因:同一台机子上开着两个web工程,现在有需求需要保证两个项目之间交互的安全问题。因为有个旧的项目,所以尽量不做改动。只能在新项目中做改动。

处理办法:获取本地的IP地址,有请求进来时查看请求的来源,只有来源是本地IP的才予以通过。

代码如下:

/**
 * 任务调度调用拦截器
 */
public class TaskControlInterceptor implements Interceptor {

   //存放本机IP地址列表(包括ipv4和ipv6)
   private static Set localHostList = new HashSet<>();

   @Override
   public void intercept(Invocation inv) {
      Controller controller = inv.getController();
      HttpServletRequest request = controller.getRequest();
      /*
      获取本机的IP地址列表
      请求的时候判断来源IP地址是否在该列表中,如果不在的话则不予通过
       */
      if (localHostList.size() == 0) {
         localHostList = getIpAddress();
      }
      if (StringUtils.isNotBlank(request.getRemoteAddr())) {
         if (!localHostList.contains(request.getRemoteAddr())) {
            Result result = new Result(new Error("450","非法的请求,请求来源IP地址不是本机"));
            controller.getResponse().setStatus(450);
            controller.renderJson(result);
            return;
         }
      } else {
         Result result = new Result(new Error("450","非法的请求,请求来源IP地址为空"));
         controller.getResponse().setStatus(450);
         controller.renderJson(result);
         return;
      }
      inv.invoke();
   }

   /**
    * 获取本机的IP地址(包括ipv4和ipv6)
    * 
包含回环地址127.0.0.1和0:0:0:0:0:0:0:1 */ private static Set getIpAddress() { Set ipList = new HashSet<>(); try { Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); InetAddress ip = null; while (allNetInterfaces.hasMoreElements()) { NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); //排除虚拟接口和没有启动运行的接口 if (netInterface.isVirtual() || !netInterface.isUp()) { continue; } else { Enumeration addresses = netInterface.getInetAddresses(); while (addresses.hasMoreElements()) { ip = addresses.nextElement(); if (ip != null && (ip instanceof Inet4Address || ip instanceof Inet6Address)) { ipList.add(ip.getHostAddress()); } } } } } catch (Exception e) { e.printStackTrace(); } return ipList; } }

 

你可能感兴趣的:(java基础,后端)