为节约服务器性能,防止用户无效快速点击。引入一个处理时间间隔,时间间隔内不处理。以发送邮件验证码为例
该解决方案为非session方式,首先建立两个静态共享字段分别存储email的hash代码和上次响应的时间
每次响应之前比较本次email的hash值是否和上次相同
如果相同,则判断时间间隔是否短于设定值,如果间隔短,则不响应。
因为静态变量为所有实例共享,所以如果有两个email有共同的hash,则可能出现一个email发送验证码而另一个无法发送送的情况。
同时满足hash和时间的要求几率太低,所以使用hash值是可行的。如果是其他处理程序,把email更换为ip地址也能达到同样的效果
参考代码如下:
public static int EmailHash =0; public static DateTime lastDate; /// <summary> /// 发送邮箱验证码 /// </summary> /// <param name="email">邮箱地址</param> /// <returns></returns> [WebMethod] public ResponseResult SendEmailCode(string email) { ResponseResult result = new ResponseResult(); int ValidateNO = user.GetAssociateCode(email); if (EmailHash == email.GetHashCode()) { try { if (lastDate!=null) { TimeSpan d = DateTime.Now - lastDate; if (d.TotalSeconds <= 15) { result.IsSuccess = false; result.MsgAlert = "发送邮件失败,时间间隔太短"; return result; } } } catch (Exception) { } } bool isSendEmailSuccess = BlogHelpper.SendEmail(email, "完成注册账户注册,请接收验证码,", "如非本人操作请忽略,验证码是:" + ValidateNO.ToString()); if (isSendEmailSuccess) { result.IsSuccess = true; result.MsgAlert = "发送验证码成功,查收邮件后填写验证码完成最后确认"; //记录上次发送时间 lastDate = DateTime.Now; //记录email的 hush_code EmailHash = email.GetHashCode(); } else { result.IsSuccess = false; result.MsgAlert = "发送邮件失败,出现未知错误"; } return result; } }