省份与运营商定向

来源:互联网 发布:阿里云cdn配置https 编辑:程序博客网 时间:2024/05/17 01:37

   我接触的互联网产品,基本都需要定向推广以及营销,何谓定向, 对某类群体用户推广以及定向--->省份和运营商,算是大范围的一个定向推广吧。


 就目前知道的有2类方式:  ip 和imsi 


      ip定向,根据ip来获取省份,但是ip具有不规律性以及变动较大的原因,如果要求高,需要完善的ip库,获取方法如下,相信这样额

public final static String getIpAddress(HttpServletRequest request) throws Exception {  
       // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址  
 
       String ip = request.getHeader("X-Forwarded-For");  
       if (logger.isInfoEnabled()) {  
           logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);  
       }  
 
       if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("Proxy-Client-IP");  
               if (logger.isInfoEnabled()) {  
                   logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);  
               }  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("WL-Proxy-Client-IP");  
               if (logger.isInfoEnabled()) {  
                   logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);  
               }  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("HTTP_CLIENT_IP");  
               if (logger.isInfoEnabled()) {  
                   logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);  
               }  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
               if (logger.isInfoEnabled()) {  
                   logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);  
               }  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getRemoteAddr();  
               if (logger.isInfoEnabled()) {  
                   logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);  
               }  
           }  
       } else if (ip.length() > 15) {  
           String[] ips = ip.split(",");  
           for (int index = 0; index < ips.length; index++) {  
               String strIp = (String) ips[index];  
               if (!("unknown".equalsIgnoreCase(strIp))) {  
                   ip = strIp;  
                   break;  
               }  
           }  
       }  
       return ip;  
   } 



  第二部,拿到ip咋办呢.


 


  看到这图就这道麻烦聊,将上图的范围全部转换long,那么他在long的范围


目前处理办法如下,将ip转换成long



转换成ip之后就根据sql去定位,只要在这个范围是吧,后面因为查询频繁,将结果缓存到redis里了, 或者把整个转换的结果放到redis里,根据redis提供的范围函数去匹配来减轻db的压力



2:imsi


public static String getMobileByIMSI(String imsi) {

String moblie = "";

int index = 0;


if (imsi != null && !"".equals(imsi)  &&  imsi.length() > 10) {
String mnc = imsi.substring(0, 5);
String msin = imsi.substring(5, imsi.length());
int nMNC = Integer.parseInt(mnc);
switch (nMNC) {
// 移动
case 46000:
index = Integer.parseInt(msin.substring(3, 4)); // 13S号码段
if (index >= 5 && index <= 9) {
moblie = "13";
moblie += index;
moblie += "0";
moblie += msin.substring(0, 3);
} else {
moblie = "13";
moblie += index+5;
moblie += msin.substring(4, 5);
moblie += msin.substring(0, 3);
}
break;
//移动
case 46002:
index = Integer.parseInt(msin.substring(0, 1));
switch (index) {
case 0:
if (Integer.parseInt(msin.substring(1, 2)) <= 8) {
moblie = "134" + msin.substring(1, 5);
}
break;
case 1:
case 2:
case 8:
case 9:
moblie = "15"+index +  msin.substring(1, 5);
break;
case 3:
moblie = "150" + msin.substring(1, 5);
break;
case 5:
moblie = "183" + msin.substring(1, 5);
break;
case 6:
moblie = "182" + msin.substring(1, 5);
break;
case 7:
moblie = "187" + msin.substring(1, 5);
break;
}
break;
//移动
case 46007:
index = Integer.parseInt(msin.substring(0, 1));
switch (index) {
case 7:
moblie = "157" + msin.substring(1, 5);
break;
case 8:
moblie = "188" + msin.substring(1, 5);
break;
case 9:
moblie = "147" + msin.substring(1, 5);
break;
}
break;
// 联通
case 46001:
index = Integer.parseInt(msin.substring(4, 5));
switch (index) {
// 13段
case 0:
case 1:
moblie += "130";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 9:
moblie += "131";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 2:
moblie += "132";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
// 15段
case 3:
moblie += "156";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 4:
moblie += "155";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
// 18段
case 6:
moblie += "186";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 5:
moblie += "185";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;

}
break;
// 电信
case 46003:
if (msin.substring(0, 1).equals("0")) {
index = Integer.parseInt(msin.substring(1, 2));
switch (index) {
case 9:
if ("00" == msin.substring(2, 4)) {
moblie += "13301";
moblie += msin.substring(4, 6);
} else if ("53" == msin.substring(2, 4) || "54" == msin.substring(2, 4)) {
moblie += "133";
moblie += Integer.parseInt(msin.substring(2, 6)) + 4500;
} else {
moblie += "133";
moblie += msin.substring(2, 6);
}
break;
case 3:
moblie += "133";
moblie += Integer.parseInt(msin.substring(2, 6)) + 5000;
break;
}
} else {
moblie += "153";
moblie += msin.substring(1, 3);
moblie += msin.substring(4, 6);
}
break;

default:
break;
}
}
return moblie;


  根据imsi获取mobile标识,然后去imsi卡库匹配


运营山判断:

public static String getNetType(String imsi) {
String netType = "";
if (imsi != null && !"".equals(imsi)  &&  imsi.length() > 10) {
String mnc = imsi.substring(0, 5);
int nMNC = Integer.parseInt(mnc);
switch (nMNC) {
// 移动
case 46000:
netType = "2";
break;
//移动
case 46002:
netType = "2";
break;
//移动
case 46007:
netType = "2";
break;
// 联通
case 46001:
netType = "3";
break;
// 电信
case 46003:
netType = "4";
break;

default:
break;
}
}
return netType;
}



我们做的 ,只是让结果跟家靠近吧,代码没咋整理...


0 0