为节约服务器性能,防止用户无效快速点击。引入一个处理时间间隔,时间间隔内不处理。以发送邮件验证码为例
该解决方案为非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;
}
}