using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Configuration; using System.Data; using System.Web.Security; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml; using System.Drawing; public partial class ValidNums : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string validateNum = CreateRanjdomNum(4); //成生4位随机字符串 CreateIamge(validateNum); //将生成的随机字符串绘成图片 Session["ValidNums"] = validateNum; //保存验证码 } } //生成随机字符串 private string CreateRanjdomNum(int NumCount) { string allchar = "2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, H, J, K, L, M, N, P, Q, R, S, T, U, W, X, Y, Z"; string[] allcharArray = allchar.Split(',');//拆分成数组 string randomNum = ""; int temp = -1; //记录上次随机数的数值,尽量避免产生几个相同的随机数 Random rand = new Random();//声明一个Random对象 for (int i = 0; i < NumCount; i++) { if (temp != -1) { rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); } int t = rand.Next(31); if (temp == t) { return CreateRanjdomNum(NumCount); } temp = t; randomNum += allcharArray[t]; //生成随机字符串 } return randomNum; } //生成图片 private void CreateIamge(string validateNum) { if (validateNum == null || validateNum.Trim() == String.Empty) { return; } //生成Bitmap图像 Bitmap image = new Bitmap(validateNum.Length * 12+10 , 30); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景色 g.Clear(Color.White); //话图片的背景噪音线 for (int i = 0; i < 25; i++) { //确定噪音线的位置 int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);//绘制背景噪音线 } //设置背景字体样式 Font font = new Font("Arial", 15, (FontStyle.Bold | FontStyle.Italic)); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(validateNum, font, brush,2,2); //画图片的前景噪音点 for (int i = 0; i < 100; i++) { //确定前景噪音点的位置 int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); //绘制前景噪音点 } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new System.IO.MemoryStream(); //将图片保存到指定的流 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; //设置保存图片的格式 Response.BinaryWrite(ms.ToArray()); //执行保存图片的操作 } finally //无论代码中是否有错误,都执行Finally的程序代码 { g.Dispose(); //关闭g对象 image.Dispose(); //关闭image对象 } } }
protected void btnLogin_Click(object sender, EventArgs e) { try { //判断用户名、密码、验证码的输入不能为空 if (txtUserName.Text == "" || txtUserPass.Text == "" || txtValidNums.Text == "") { this.Page.RegisterStartupScript("ss", "<script>alert('用户名、密码或验证码不能为空!’');</script>"); return; } else { string num = txtValidNums.Text.Trim();//获取验证码信息 //判断输入的验证码是否正确 if (Session["ValidNums"].ToString() == num.ToUpper()) { //连接数据库 SQLServer db = new SQLServer();
我的登录页面login.aspx放验证码的地方是用image控件,ImageUrl="~/ValidNums.aspx"。
验证输入时用的是:在login.aspx.cs里
string num = txtValidNums.Text.Trim();//获取验证码信息
//判断输入的验证码是否正确
if (Session["ValidNums"].ToString() == num.ToUpper())
有两个地方需要改一下:
1、
if (!IsPostBack)
{
string validateNum = CreateRanjdomNum(4); //成生4位随机字符串
Session["ValidNums"] = validateNum; //保存验证码
CreateIamge(validateNum); //将生成的随机字符串绘成图片
}
原因:Response.BinaryWrite(ms.ToArray());后面的存session的代码不会在执行了。
2、
string num = txtValidNums.Text.Trim();//获取验证码信息
//判断输入的验证码是否正确
if (Session["ValidNums"].ToString().Replace(" ","").ToUpper() == num.ToUpper())
{
}
原因:生成验证码时每个字符之间有空格(或者allchar中的空格删除掉)
提交的时候验证码又请了一次
@小余儿: 没有取到session的问题是要 继承 IHttpHandler,IRequiresSessionState这两个接口。
提交完成时 页面postback了(页面刷新了),会重新加载图片,所以验证码又请求了一次!
断点跟一下吧。看下提交的时候,生成Session的代码是否又执行了一次。
提交的时候验证码又请了一次,咋解决呢!
@小余儿: 看你的代码,你是提交到了一般处理程序啊?这个一般处理程序需要实现Session相关的接口。
是不是缓存了?