package com.chinacreator.videoalliance.net.action; import com.chinacreator.common.exception.BusinessException; import com.chinacreator.common.pipe.DataOutPipe; import com.chinacreator.common.support.util.SpringContextUtil; import com.chinacreator.common.util.MD5; import com.chinacreator.videoalliance.common.annotation.DataOut; import com.chinacreator.videoalliance.common.bean.AreaInfo; import com.chinacreator.videoalliance.common.bean.CPInfo; import com.chinacreator.videoalliance.common.log.LogBean; import com.chinacreator.videoalliance.common.util.AreaUtil; import com.chinacreator.videoalliance.common.util.ConfigUtil; import com.chinacreator.videoalliance.net.bean.NetNumberLog; import com.chinacreator.videoalliance.net.bean.ProvinceInfo; import com.chinacreator.videoalliance.net.dao.NetNumberLimitDao; import com.chinacreator.videoalliance.net.dao.ProvinceInfoDao; import com.chinacreator.videoalliance.net.handler.INetHandler; import com.chinacreator.videoalliance.net.util.RequestUtil; import com.google.gson.GsonBuilder; import java.sql.SQLException; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class NetNumberAction { private static Logger logger = Logger.getLogger("netNumber"); private static Logger logger_sys = Logger.getLogger("NetNumberAction"); @Autowired private ProvinceInfoDao provinceInfoDao; @Autowired private NetNumberLimitDao netNumberLimitDao; @RequestMapping({"/netNumber.do"}) @DataOut(callback="netNumber") public DataOutPipe doNet(HttpServletRequest request, HttpServletResponse response) throws Exception { String userip = RequestUtil.getIpAddr(request); String cpid = request.getParameter("cpid"); DataOutPipe pipe = new DataOutPipe(); pipe.add("userid", null); pipe.add("flowwarn", "1"); NetNumberLog log = getLog(request); String mob = ""; try { logger_sys.info("ip============================"+userip); AreaInfo areaInfo = AreaUtil.getAreaInfoByIp(userip); logger_sys.info("unikey =====> " + UUID.randomUUID().toString().replaceAll("-", "")); if (areaInfo == null) { throw new BusinessException("9002", "用户IP为非3GIP", new String[0]); } log.setProvince(areaInfo.getProvince()); mob = doNet(request, response, areaInfo, log); if ("302".equals(mob)) { logger_sys.info("302 跳转 ==================>" + mob); return null; } log.setResultcode(mob); logger_sys.info("Net取号结果==================>" + mob); if ((mob == null) || ("null".equals(mob))) { pipe.add("mob", "null"); } else if (!this.netNumberLimitDao.allowNet(cpid, mob)) { pipe.add("userid", "null"); } else { String fakeid = ConfigUtil.getFakeid(mob, cpid); pipe.add("userid", ConfigUtil.encrypt(fakeid, cpid)); } } catch (Exception e) { log.setErrorinfo(e.getMessage()); throw e; } finally { logger_sys.info("302 跳转 后的 finally "); if (!"302".equals(mob)) { String json = new GsonBuilder().disableHtmlEscaping().serializeNulls().create().toJson(log); logger.info(json); } } return pipe; } private boolean check(HttpServletRequest request, AreaInfo areaInfo) throws Exception { String cpid = request.getParameter("cpid"); String timestamp = request.getParameter("timestamp"); String responsePwd = request.getParameter("response"); CPInfo cpInfo = ConfigUtil.getCPInfo(cpid, areaInfo.getProvince()); String md5Str = MD5.MD5Encode(cpid + timestamp + cpInfo.getNetpwd()); if (!md5Str.equals(responsePwd)) { throw new BusinessException("8005", "校验失败", new String[0]); } return true; } public String doNet(HttpServletRequest request, HttpServletResponse response, String net, int sequence) throws Exception { net = net.substring(0, 1).toUpperCase() + net.substring(1); Class netHandlerClazz = Class.forName("com.chinacreator.videoalliance.net.handler." + net + "Net"); INetHandler netHandler = (INetHandler)SpringContextUtil.getBean(netHandlerClazz); String mob = netHandler.execute(request, response, sequence); return mob; } private String doNet(HttpServletRequest request, HttpServletResponse response, AreaInfo areaInfo, NetNumberLog log) throws Exception { String mob = request.getParameter("mob"); String net = request.getParameter("net"); int sequence = NumberUtils.toInt(request.getParameter("sequence"), 0); String netTmp = ""; while ((mob == null) || ("null".equals(mob))) { if (net == null) { sequence++; if (sequence == 1) { check(request, areaInfo); } ProvinceInfo provinceInfo = getNet(areaInfo.getProvince(), sequence); if (provinceInfo == null) { break; } sequence = provinceInfo.getSequence(); net = provinceInfo.getType(); } if (net != null) { try { String result = doNet(request, response, net, sequence); if ("302".equals(result)) { return "302"; } mob = result; } catch (Throwable e) { mob = null; } } System.out.println(" netTmp = net =====> " + net); netTmp = net; net = null; } if (netTmp == null) { netTmp = request.getParameter("net"); } log.setNettype("academe".equals(netTmp) ? "2" : "1"); return mob; } private NetNumberLog getLog(HttpServletRequest request) { NetNumberLog log = (NetNumberLog)LogBean.getLogBean(NetNumberLog.class, request); log.setMemberId(request.getParameter("cpid")); log.setChannelCode(request.getParameter("channel")); log.setInputparam(RequestUtil.getQueryString(request)); log.setApptype(request.getParameter("apptype")); log.setServicename("NET取号"); log.setUnikey(request.getParameter("unikey")); log.setBackurl(request.getParameter("backurl")); return log; } public ProvinceInfo getNet(String province, int sequence) throws SQLException { return this.provinceInfoDao.getNet(province, sequence); } }