標籤:
如果期望一般處理常式(ashx)處理Session,必須實現【System.Web.SessionState】命名空間下的【IRequiresSessionState】介面。
asp.net中的驗證碼一般是通過請求ashx頁面來完成的,將ashx的內容物件的響應類型設定為"image/jpeg".使用Random類是隨機產生一個字串,把這個字串寫入到一張圖片並儲存到Session中,再將圖片儲存到響應流的輸出中,這樣每次用戶端就會請求到一個驗證碼的圖片了。
下面是我的具體實現:
用戶端
把驗證碼圖片的src屬性指向ashx驗證碼處理常式的路徑,點擊圖片或"看不清"實現換圖的功能是通過改變驗證碼圖片的src屬性實現。在每次更換驗證碼時,為了避免緩衝而未發出請求,需要在src屬性的URL末尾加個不固定的參數,如:this.src="getValidateCode.ashx?t="+new Date();因為瀏覽器處理相同的請求的時候是優先從緩衝中讀取的,這樣瀏覽器會為每次請求都發送請求,而不是從緩衝中讀取。
伺服器端
產生隨機碼的方法:
1 private string getValidateCode(int validateCodeLength) 2 { 3 // 定義可能出現的所有字串,實際應用中有些字元很難區分,如0和o,可以去掉。 4 string allChars = @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 5 // 擷取所有字元的長度 6 int charsLength = allChars.Length; 7 8 string validateCode = string.Empty; 9 // 聲明隨機數產生器10 Random ran = new Random();11 //迴圈的次數代表產生的隨機字串的長度12 for (int i = 0; i < validateCodeLength; i++)13 {14 //將隨機產生的數字作為字串的索引,從而可以獲得其下標所在的字元,並將這個字元加到隨機字串上15 validateCode += allChars[ran.Next(charsLength)];16 }17 //返回字串18 return validateCode;19 }
ashx中的處理過程
1 public void ProcessRequest(HttpContext context) 2 { 3 //將響應類型設定成圖片 4 context.Response.ContentType = "image/jpeg"; 5 //擷取一個4位元的驗證碼 6 string validateCode = getValidateCode(4); 7 //把驗證碼寫入Session 8 context.Session["validateCode"] = validateCode; 9 //建立驗證碼圖片10 using (Bitmap img = new Bitmap(100, 40))11 {12 //擷取背景驗證碼的背景圖片路徑13 string bgPath = context.Server.MapPath("~/image/bg.gif");14 using (Bitmap bg = new Bitmap(bgPath))15 {16 using (Graphics g = Graphics.FromImage(img))17 {18 //使用背景圖片畫刷填充驗證碼圖片19 g.FillRectangle(new TextureBrush(bg), 0, 0, img.Width, img.Height);20 //將驗證碼字串寫入圖片21 g.DrawString(validateCode, new Font("微軟雅黑", 16, FontStyle.Italic), Brushes.Black, 5, 5);22 //將驗證碼圖片儲存至響應流,用戶端就能看到這個圖片了23 img.Save(context.Response.OutputStream, ImageFormat.Jpeg);24 }25 }26 }27 }
在Asp.net中使用一般處理常式產生驗證碼