CSS&javascript 避免重複創立帳號&亂數碼驗證
目的相當很簡單
接著,再撰寫取得Session的ashx
位於/Tools/GetVaildAnswer.ashx:
=============================================================================
以上,即完成Session的存取設定,接著
要在專門執行寫入資料庫的NWDB專案進行修改
才可以引用及寫入資料庫的行為:
在實作的檔案加入addNewMember新增會員的方法
NWDB.cs當然也要加入這個方法,如此才可以引用
=============================================================================
看來很複雜,其實滿好寫的, 如此即完成NWDB的撰寫
最後就是網頁端的重點
由於使用者可能會上一頁、下一頁、重新整理的亂按
無法預期,為了避免這樣的狀況
我們使用一個方法就是:
當使用者寫完註冊內容送出後,會先到一個使用者看不到網頁
進行寫入資料庫的行為及跳轉,到另一個網頁出現「新增帳戶成功!」的訊息
中間放一個跳板,使按下「上一頁」回不去註冊畫面
即使重新整理,也只是整理成功訊息的網頁,裡面沒有任何資料
成功的訊息網頁很簡單,就只是短短一行加入會員成功。
這樣就可以避免重複寫入資料庫了
不只是會員,像是訂單同樣也可以這樣運用。
1、取得亂數圖的值
2、不重複寫入資料庫
在加入會員部份已經做過很多:
「加入會員」驗證資料及亂數產生驗證碼
jquery使用ajax驗證帳號(運用介面、多型)
其中的亂數驗證,本來是用cookie的方式達到傳取值的目的
現在用Session的方式好處是相對安全一點
因為cookie是放在使用者的電腦
而Session是放在伺服器中
壞處自然是伺服器負擔會相對大一點
第2點呢,是使用者的行為是不可預期的,假設某使用者
在加入會員時,輸入數值後一直重新整理
會造成重複寫入資料庫的嚴重錯誤
若是訂單的話就更可怕了,所以要避免這樣的情況發生
亂數部份,請先參考之前寫好的資料
並改成以下的程式碼,以存入Session
檔案位於/Tools/GetVaildImage.ashx:
「加入會員」驗證資料及亂數產生驗證碼
jquery使用ajax驗證帳號(運用介面、多型)
其中的亂數驗證,本來是用cookie的方式達到傳取值的目的
現在用Session的方式好處是相對安全一點
因為cookie是放在使用者的電腦
而Session是放在伺服器中
壞處自然是伺服器負擔會相對大一點
第2點呢,是使用者的行為是不可預期的,假設某使用者
在加入會員時,輸入數值後一直重新整理
會造成重複寫入資料庫的嚴重錯誤
若是訂單的話就更可怕了,所以要避免這樣的情況發生
亂數部份,請先參考之前寫好的資料
並改成以下的程式碼,以存入Session
檔案位於/Tools/GetVaildImage.ashx:
using System; using System.Collections.Generic; using System.Drawing; using System.Web; using System.Web.SessionState;//務必放入,不然寫不進Session namespace WebPractice.Tools { public class GetVaildImage : IHttpHandler,IRequiresSessionState//要implement這個類別 { public void ProcessRequest(HttpContext context) { //記得引入驗證圖參考,本例為8位數的驗證圖 Vaild.VaildNum vn = new Vaild.VaildNum(8); context.Session.Add("VaildAns", vn.VaildNumAnswer);//寫入Session Bitmap bmp = vn.VaildNumImage; //存於記憶體中的串流 System.IO.MemoryStream ms = new System.IO.MemoryStream(); //bmp.Save(存放位置,存放格式) bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //轉成陣列後輸出 byte[] bb = ms.ToArray(); context.Response.OutputStream.Write(bb,0,bb.Length); } public bool IsReusable { get { return false; } } } }
接著,再撰寫取得Session的ashx
位於/Tools/GetVaildAnswer.ashx:
using System; using System.Collections.Generic; using System.Web; using System.Web.SessionState;//務必放入,不然寫不進Session namespace WebPractice.Tools { public class GetVaildAnswer : IHttpHandler,IRequiresSessionState//要implement這個類別 { public void ProcessRequest(HttpContext context) { context.Response.Write(context.Session["VaildAns"]);//取得Session的值並回傳 } public bool IsReusable { get { return false; } } } }
=============================================================================
以上,即完成Session的存取設定,接著
要在專門執行寫入資料庫的NWDB專案進行修改
才可以引用及寫入資料庫的行為:
IMember.cs:
public interface IMember { bool CheckMemberDuplicate(string Account); //加入會員的方法,會回傳bool值 bool addNewMember( string Account, byte[] Password,string FirstName, string LastName, byte Sex ,string Birth,string County,string Region,string Address,string Edu,string Email); } }
在實作的檔案加入addNewMember新增會員的方法
ImplImember.cs:
public bool addNewMember(string Account, byte[] Password, string FirstName, string LastName,byte Sex, string Birth, string County, string Region, string Address, string Edu, string Email) { SqlCommand cmd = new SqlCommand( "INSERT INTO 會員表(帳號,密碼,姓,名,性別,生日,縣市,鄉鎮,地址,學歷,電子郵件) VALUES(@account,@password,@firstname,@lastname,@sex, @birth, @county, @region, @address, @edu, @email)", cnn); cmd.Parameters.Add("@account", SqlDbType.VarChar).Value = Account; cmd.Parameters.Add("@password", SqlDbType.Image).Value = Password; cmd.Parameters.Add("@firstname", SqlDbType.VarChar).Value = FirstName; cmd.Parameters.Add("@lastname", SqlDbType.VarChar).Value = LastName; cmd.Parameters.Add("@sex", SqlDbType.Bit).Value = Sex; cmd.Parameters.Add("@birth", SqlDbType.VarChar).Value = Birth; cmd.Parameters.Add("@county", SqlDbType.VarChar).Value = County; cmd.Parameters.Add("@region", SqlDbType.VarChar).Value = Region; cmd.Parameters.Add("@address", SqlDbType.VarChar).Value = Address; cmd.Parameters.Add("@edu", SqlDbType.VarChar).Value = Edu; cmd.Parameters.Add("@email", SqlDbType.VarChar).Value = Email; cnn.Open(); int nn = cmd.ExecuteNonQuery(); cmd.Dispose(); cnn.Close(); if (nn > 0) return true;//寫入成功 else return false;//失敗 }
NWDB.cs:
#region 新增帳戶 public bool addNewMember(string Account, byte[] Password, string FirstName, string LastName, byte Sex, string Birth, string County, string Region, string Address, string Edu, string Email) { return im.addNewMember(Account,Password,FirstName,LastName,Sex,Birth,County,Region,Address,Edu,Email); } #endregion 新增帳戶
=============================================================================
看來很複雜,其實滿好寫的, 如此即完成NWDB的撰寫
最後就是網頁端的重點
由於使用者可能會上一頁、下一頁、重新整理的亂按
無法預期,為了避免這樣的狀況
我們使用一個方法就是:
當使用者寫完註冊內容送出後,會先到一個使用者看不到網頁
進行寫入資料庫的行為及跳轉,到另一個網頁出現「新增帳戶成功!」的訊息
中間放一個跳板,使按下「上一頁」回不去註冊畫面
即使重新整理,也只是整理成功訊息的網頁,裡面沒有任何資料
首先是加入會員的網頁jquery撰寫:
<script type="text/javascript"> //由於內容太長,而且之前也寫過了,所以重複的部份就不寫入 //這邊程式碼只針對驗證圖及對應答案的部份 $(document).ready(function () { //驗證答案 getVaildans(); //按下重新取得驗證圖 $("#RefreshVaildImgBtn").click(function () { $("#VaildNumImg").attr ("src", "/Tools/GetVaildImage.ashx?time=" + new Date().getTime()); getVaildans(); }); }); //取得驗證答案 function getVaildans() { $.get("/Tools/GetVaildAnswer.ashx?time=" + new Date().getTime(), null, function (ans) { $("#VaildAns").val(ans); alert(ans); }, "text"); } function checkForm() { var msg = ""; if ($("#VaildAnsText").val() != $("#VaildAns").val().toLowerCase()) msg += "* 驗證答案有誤"; if (msg != "") { alert(msg); return false; } else { $("#form1").submit(); } } </script> //form的部份請將action轉向中轉的ashx泛式 <form id="form1" action="AddNewMemberProcess.ashx" method="post">
再來是中轉的AddNewMemberProcess.ashx網頁撰寫:
public void ProcessRequest(HttpContext context) { string Account = context.Request.Form["Account"]; string Password = context.Request.Form["Password"]; string FirstName = context.Request.Form["FirstName"]; string LastName = context.Request.Form["LastName"]; string Sex = context.Request.Form["Sex"]; string Birth = context.Request.Form["Birth"]; string County = context.Request.Form["County"]; string Region = context.Request.Form["Region"]; string Address = context.Request.Form["Address"]; string Edu = context.Request.Form["Edu"]; string Email = context.Request.Form["EMail"]; //密碼要加密,即使進到資料庫也看不出答案 //最前面要引入using System.Security.Cryptography; //簡單來說,只有使用者知道自已設定的密碼,網站及資料庫都沒辦法得知 byte[] originalPassword = System.Text.Encoding.UTF8.GetBytes(Password);//將使用者輸入的轉成2進位碼 SHA256Managed sha256 = new SHA256Managed();//new出加密引擎,使用SHA256 byte[] hashlPassword = sha256.ComputeHash(originalPassword);//將該2進位碼加密 byte ssex = (byte)((Sex == "男") ? 1 : 0); //寫入資料庫,sqluser權限不夠所以要改用sqladmin帳號 NWDB.NWDB nwdb = new NWDB.NWDB("SQLAdmin", "1234"); NWDB.IMember im = new NWDB.ImplImember(nwdb.Connection); nwdb.SetMember(im); nwdb.addNewMember(Account, hashlPassword, FirstName, LastName, ssex, Birth, County, Region, Address, Edu, Email); //轉向成功訊息的網站 context.Response.Redirect("AddNewMemberFinish.aspx"); }
成功的訊息網頁很簡單,就只是短短一行加入會員成功。
這樣就可以避免重複寫入資料庫了
不只是會員,像是訂單同樣也可以這樣運用。
留言
張貼留言