验证码在一定时间内限制发送 /** * 一个小时只能调用几次,如果超出规则就抛出异常 */ /** * */private static HashMap Info = new HashMap (); //保存用户名 和 时间 以及 发送次数 private static Long m
/** * 一个小时只能调用几次,如果超出规则就抛出异常 */ /** * */ private static HashMapInfo = new HashMap (); //保存用户名 和 时间 以及 发送次数 private static Long mobileInfoClearTime=System.currentTimeMillis(); //初始化时间 在n 个小时后请求时会清空 info的缓存 @Override protected void action(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //HttpSession session=request.getSession(); String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) { ip = request.getRemoteAddr(); } String ipAndMobile=ip+request.getParameter("mobile"); log.info("===验证码发送初始化=========是否清空缓存(是否大于28800,如果大于就清空缓存)=" +(System.currentTimeMillis()-mobileInfoClearTime)/1000); if(((System.currentTimeMillis()-mobileInfoClearTime)/1000)>(28800)) { mobileInfoClearTime=System.currentTimeMillis(); //当前毫秒(上一次毫秒) Info.clear(); log.info("===验证码发送(超过8小时清空缓存)=====当前时间=" + mobileInfoClearTime); } //获取发送次数和时间 String timeAndCount=(String)Info.get(ipAndMobile); String[] timeAndCountRow=null; Long time=null; Integer count=null; if(timeAndCount!=null){ timeAndCountRow=timeAndCount.split(";"); //获取时间 time=Long.valueOf(timeAndCountRow[0]); //获取发送次数 count=Integer.valueOf(timeAndCountRow[1]); Calendar date=Calendar.getInstance(); //获取当前系统时间 int hour = date.get(Calendar.HOUR_OF_DAY); //设置为上一次时间 date.setTimeInMillis(time); //获取上一次放送时间 int hour2 = date.get(Calendar.HOUR_OF_DAY); //不同小时发送验证码 if(hour2!=hour) { //修改次数为 1 和设置当前时间 Info.put(ipAndMobile,System.currentTimeMillis()+";"+1); this.sendCode(request, response); log.info("用户ipAndMobile:"+ipAndMobile+"计数器初始化:1---不同小时发送验证码"); } //一小时之内 发送验证码超出 6次就报空 if(count>6&&((System.currentTimeMillis()-time)/1000<3600)) { response.getWriter().write("");//返回空则前端会提示出错 return; } } if(time!=null){ //第一次不会进入 但是以后都会进入 //限制每分钟只能请求一次 if((System.currentTimeMillis()-time)/1000<60){ response.getWriter().write("");//返回空则前端会提示出错 System.out.println("用户频繁发送验证码-----》失败了!!!"); }else { //否则发送验证码 计数器 加+1 count++; Info.put(ipAndMobile, System.currentTimeMillis()+";"+count); this.sendCode(request, response); System.out.println(System.currentTimeMillis()+";"+count); System.out.println("用户成功发送验证码!!!"); } System.out.println("这里输出ip的时间"+Info.get(ipAndMobile).toString()); }else { //初始化数据 Info.put(ipAndMobile, System.currentTimeMillis()+";"+1); //发送验证码 this.sendCode(request, response); System.out.println(System.currentTimeMillis()+";"+1); System.out.println("用户在同一ip同一手机号码第一次 成功发送验证码!!!"); } }