Package com.dianping.cat.servlet

Source Code of com.dianping.cat.servlet.CdnFilter

package com.dianping.cat.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.unidal.lookup.util.StringUtils;

import com.dianping.cat.Cat;
import com.dianping.cat.message.Metric;

public class CdnFilter implements Filter {

  private static final String DI_LIAN = "DiLian";

  private static final String WANG_SU = "WangSu";

  private static final String TENG_XUN = "TengXun";

  @Override
  public void destroy() {
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
    try {
      HttpServletRequest httpServletRequest = (HttpServletRequest) request;
      String vip = queryVip(httpServletRequest);
      String sourceIp = querySourceIp(httpServletRequest);

      if (StringUtils.isNotEmpty(sourceIp) && StringUtils.isNotEmpty(vip)) {
        Metric metric = Cat.getProducer().newMetric("cdn", vip + ":" + sourceIp);

        metric.setStatus("C");
        metric.addData(String.valueOf(1));
      }
    } catch (Exception e) {
      Cat.logError(e);
    }
    chain.doFilter(request, response);
  }

  private String filterXForwardedForIP(String ip) {
    if (ip == null || ip.trim().length() == 0) {
      return null;
    } else {
      String[] subIps = ip.split(",");
      int length = subIps.length;
      int index = -1;

      for (int i = 0; i < length; i++) {
        String subIp = subIps[i];
        if (subIp == null || subIp.trim().length() == 0) {
          continue;
        } else {
          subIp = subIp.trim();
          if (subIp.startsWith("192.168.") || subIp.startsWith("10.") || "127.0.0.1".equals(subIp)) {
            continue;
          } else if (subIp.startsWith("172.")) {
            String[] iptabs = subIp.split("\\.");
            int tab2 = Integer.parseInt(iptabs[1]);

            if (tab2 >= 16 && tab2 <= 31) {
              continue;
            } else {
              index = i;
              break;
            }
          } else {
            index = i;
            break;
          }
        }
      }

      if (index > -1 && index + 1 <= length) {
        return subIps[index + 1];
      } else {
        return null;
      }
    }

  }

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }

  private String querySourceIp(HttpServletRequest request) {
    return filterXForwardedForIP(request.getHeader("x-forwarded-for"));
  }

  private String queryVip(HttpServletRequest request) {
    String serverName = request.getServerName();

    if (serverName != null) {
      if (serverName.contains("s1.dpfile.com")) {
        return DI_LIAN;
      }
      if (serverName.contains("i1.dpfile.com") || serverName.contains("i3.dpfile.com")
            || serverName.contains("t2.dpfile.com")) {
        return DI_LIAN;
      }
      if (serverName.contains("s2.dpfile.com")) {
        return WANG_SU;
      }
      if (serverName.contains("i2.dpfile.com") || serverName.contains("t1.dpfile.com")
            || serverName.contains("t3.dpfile.com")) {
        return WANG_SU;
      }
      if (serverName.contains("s3.dpfile.com")) {
        return TENG_XUN;
      }
    }
    return null;
  }

}
TOP

Related Classes of com.dianping.cat.servlet.CdnFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.