台灣最大程式設計社群網站
線上人數
1764
 
會員總數:241166
討論主題:186825
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 我設計的網頁驗證碼圖片沒辦法顯示
[ 變換順序 ]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
我設計的網頁驗證碼圖片沒辦法顯示
價值 : 10 QP  點閱數:279 回應數:25

樓主

小羊
門外漢
0 4
144 61
發送站內信

我有寫一個aspx
Imports System.Drawing

Partial Public Class CheckImageCode
Inherits System.Web.UI.Page

Private Function GenerateCheckCode() As String
Dim number As Integer
Dim code As Char
Dim checkCode As String = String.Empty
Dim random As System.Random = New Random()
'要製造出幾個驗證碼
For i As Integer = 0 To 3
'number = random.[Next]()
number = random.Next
'亂數決定哪一個是數字或字母
If number Mod 2 = 0 Then
code = CChar(ChrW(Asc("0") + (number Mod 10)))
Else
code = CChar(ChrW(Asc("A") + (number Mod 26)))
End If
checkCode += code.ToString()
Next
'寫入Cook
Response.Cookies.Add(New HttpCookie("CheckCode", checkCode))
Return checkCode
End Function

Private Sub CreateCheckCodeImage(ByVal checkCode As String)
If checkCode Is Nothing OrElse checkCode.Trim() = [String].Empty Then
Return
End If

'System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
'System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 20)), 40);
Dim image As New System.Drawing.Bitmap(100, 30)

Dim g As Graphics = Graphics.FromImage(image)

Try
'生成隨機生成器
Dim random As New Random()

'清空圖片背景色
g.Clear(Color.White)

'畫圖片的背景噪音線
For i As Integer = 0 To 24
Dim x1 As Integer = random.[Next](image.Width)
Dim x2 As Integer = random.[Next](image.Width)
Dim y1 As Integer = random.[Next](image.Height)
Dim y2 As Integer = random.[Next](image.Height)

g.DrawLine(New Pen(Color.Silver), x1, y1, x2, y2)
Next

Dim font As Font = New System.Drawing.Font("Arial", 22, (System.Drawing.FontStyle.Bold Or System.Drawing.FontStyle.Italic))
Dim brush As New System.Drawing.Drawing2D.LinearGradientBrush(New Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, True)
'g.DrawString(checkCode, font, brush, 2, 2);
g.DrawString(checkCode, font, brush, 2, 2)

'畫圖片的前景噪音點
For i As Integer = 0 To 499
Dim x As Integer = random.[Next](image.Width)
Dim y As Integer = random.[Next](image.Height)

image.SetPixel(x, y, Color.FromArgb(random.Next))
Next

'畫圖片的邊框線
g.DrawRectangle(New Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1)

Dim ms As New System.IO.MemoryStream()
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif)
Response.ClearContent()
Response.ContentType = "image/Gif"
Response.BinaryWrite(ms.ToArray())
Finally
g.Dispose()
image.Dispose()
End Try
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
CreateCheckCodeImage(GenerateCheckCode())
End Sub
End Class

然後在登入畫面放入程式
Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login1.Authenticate
If Request.Cookies("CheckCode") Is Nothing Then
Me.lblMsg.Text = "無法取得Cookie,請檢察瀏覽器是否有封鎖Cookie!!"
Else
If String.Compare(Me.txtChkCode.Text.ToUpper, Request.Cookies("CheckCode").Value) <> 0 Then
Me.lblMsg.Text = "驗證碼錯誤!!"
Else
For Each R As TableRow In GridView1.Rows
If Login1.UserName = R.Cells(0).Text Then
If Login1.Password = R.Cells(1).Text Then
cn.Open()
cm.Connection = cn
cm.CommandText = "Insert Into login (account , logintime ) Values ('" & R.Cells(0).Text & "' , '" & DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") & " ')"
cm.ExecuteNonQuery()
cn.Close()
Session("Authority") = R.Cells(3).Text
If R.Cells(3).Text = "manager" Then
Response.Redirect("Default3.aspx")
Else
Response.Redirect("Default2.aspx")
End If
End If
End If
Next
End If
End If
End Sub

在前面也有放入
<asp:Image ID="imgChkCode"
ImageUrl="C:\Documents and Settings\we\My Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\CheckImageCode.aspx"
runat="server" />
<asp:Button ID="btnReGenCode" runat="server" Text="重產驗證碼" />
<br />
但是圖片卻沒有顯示
可以請大大幫幫我嗎?

搜尋相關Tags的文章: [ ASP.NET ] , [ 驗證碼 ] , [ 網頁 ] ,
本篇文章發表於2017-11-14 09:37
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
16樓
作者回應

小羊
檢舉此回應
我找到login
<input type="submit" name="Login1$LoginButton" value="Log In" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Login1$LoginButton&quot;, &quot;&quot;, true, &quot;Login1&quot;, &quot;&quot;, false, false))" id="Login1_LoginButton" style="color:#284E98;background-color:White;border-color:#507CD1;border-width:1px;border-style:Solid;font-family:Verdana;font-size:0.8em;">
本篇文章回覆於2017-11-14 11:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
17樓
回應

Jerry
捐贈 VP 給 Jerry 檢舉此回應
如果是這樣的name,那這樣的FindControl應該找的到才對,我這邊測試也OK,不知道環境有什麼不同

本篇文章回覆於2017-11-14 11:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
18樓
作者回應

小羊
檢舉此回應

她錯誤訊息我看不懂
本篇文章回覆於2017-11-14 11:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
19樓
作者回應

小羊
檢舉此回應
然後網頁錯誤描述
Server Error in '/' Application.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
本篇文章回覆於2017-11-14 11:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
20樓
回應

Jerry
捐贈 VP 給 Jerry 檢舉此回應
你把兩行程式都放到Page_Load裡面試試,不要放外面
這個錯誤訊息的意思是 並未將物件參考設定為物件的執行個體
就是FindControl找不到該物件的意思
本篇文章回覆於2017-11-14 11:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
21樓
作者回應

小羊
檢舉此回應
解決了!!
太感謝你了!!
本篇文章回覆於2017-11-14 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
22樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
您好
通常加上圖片驗證碼,目的是要防止機器人大量的暴力測試

您文中提到,您是存放Cookie
由於Cookie可能被機器人讀取,而輕易破解我們想防範的目的
所以,強烈建議您,使用Session來記錄與驗證使用者的輸入

相關程式碼,您可以參考小喵的這一篇
[ASP.NET]幫Login加上驗證碼

另外,如果您的開發是無狀態的方式(不能使用Session)
那麼存放Cookie的內容,還要額外的加工處理才能有效防範,有興趣,再細談這個部分

^_^
本篇文章回覆於2017-11-14 14:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
23樓
作者回應

小羊
檢舉此回應
我就是參考喵大那篇文章修改的
那如果要改成存入session
要怎麼用那篇來修改?
本篇文章回覆於2017-11-14 16:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
24樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
小喵的內容已經改成用Session了(今天剛改的)
您再看一下產生後存的部分,以及登入時的比較部分

^_^
本篇文章回覆於2017-11-14 18:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
25樓
作者回應

小羊
檢舉此回應
謝謝喵大!!
本篇文章回覆於2017-11-15 08:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   

回覆
如要回應,請先登入.