如下的验证码生成与校验,部分用户反映无论如何都是验证码失效,但是部分用户正常
生成验证码时的代码
HttpCookie hc = context.Response.Cookies[cookieName];
if ( hc== null) hc=new HttpCookie(cookieName);
hc.Value = outCodeToCookie;
hc.Expires = DateTime.Now.AddMilliseconds(1*60 * 1000); context.Response.AppendCookie(hc);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = "image/Jpeg"; context.Response.BinaryWrite(ms.GetBuffer());
context.Response.Flush();
校验的时候
HttpCookie cookie = HttpContext.Current.Request.Cookies[CookieName];
if (cookie != null && !string.IsNullOrEmpty(cookie.Value))
{
if (输入正确)
{
返回正确
}
else
{返回错误}
}
return 验证码超时;
去看看客户端的时间正确呗,比如客户端的时间小与(或者说早于)当前时间,你这边是服务器设置expire时间,客户永远cookie过期。
晕,按照客户机时间?那客户机如果设定时间很小,那岂不是永不失效.这个时间难道还要保存在服务端?
@王者永乐:
你仔细想想这个原理就明白了。
这个问题我遇到过。
貌似有园友也遇到过:http://www.cnblogs.com/greystar/archive/2008/07/18/2235350.html
我当时的做法是cookie的时间从客户端作为基准。
试试将
context.Response.AppendCookie(hc);
改为
context.Response.SetCookie(hc);
context.Response.AppendCookie(hc);
这有什么问题?
@小AI: 参考:http://stackoverflow.com/a/15890244
@dudu: 改为setcookie有同样的问题
@王者永乐: 我们在开发中用的是FormsAuthenticationTicket,没遇到这个问题