標籤:error date getc att 還需要 ctr 判斷 username 還需
向伺服器發送cookie
在登陸的時候,我們可以可以通過下列代碼,向伺服器發送cookie,其中包括自己的帳號資訊(不涉及加密),用以後面判斷訪問者.
1 HttpCookie cookie = new HttpCookie("userinfo");//建立一個名為userinfo的cookie2 cookie.Values["UserName"] = username;//向cookie中加入帳號資訊3 cookie.Values["PassWord"] = userpassword;//向cookie中加入密碼資訊4 cookie.Expires = DateTime.MaxValue;//設定cookie的可存在的時間,這裡設的最長時間,cookie.Expires = System.DateTime.Now.AddDays(1);//設定存在時間1天5 Response.Cookies.Add(cookie);//寫入cookie
過濾器Filter
並不是只有登入時我們才需要請求響應cookie,其實我們在訪問任何一個頁面的時候,都需要驗證cookie資訊,判斷當前訪問該頁面的訪問者,那麼理論上,每一個控制器,每一個action,我們都需要寫入關於cookie的代碼,如此龐大的工作量,顯然是不可能的.通過過濾器filter,這個問題引刃而解.
首先我們自訂一個過濾器
1 public class CheckLogin : ActionFilterAttribute 2 { 3 public override void OnActionExecuted(ActionExecutedContext filterContext) 4 { 5 HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//擷取當前請求的所有cookie中名為userinfo的cookie 6 7 if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判斷帳號密碼資訊 8 { 9 filterContext.Result = new RedirectResult("/Account/Login");//若帳號密碼為null或者cookie不存在,即返回登入頁面10 }11 }12 }13 }
這個過濾器放在控制器或者action上面都可以實現驗證cookie的作用,可是需要作用的控制器和action數量太多,我們就需要將該過濾器作用到全域,對所有的控制器作用.
1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 6 filters.Add(new HandleErrorAttribute()); 7 filters.Add(new CheckLogin.CheckLogin()); 8 } 9 }10 }
1 public class MvcApplication : System.Web.HttpApplication2 {3 protected void Application_Start()4 {5 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);6 }7 }8 }
匿名訪問
按照上述代碼進行登陸操作,你會發現,根本找不到登入頁面,原因在於,上述全域作用的過濾器,連登入頁面都沒有放過,就是說,你連進入登陸頁面都還需要驗證資訊,沒有資訊你就返回登入頁,可是登陸頁你也無法訪問.最後就報錯.
所以對於某些特定的頁面,我們需要能夠匿名訪問,這也是一個很實際問題,很多網頁我們不需要登陸可以很輕鬆的訪問.
對於匿名訪問我們需要用到: [AllowAnonymous],能夠跳過驗證,實現匿名訪問.
1 public class CheckLogin : ActionFilterAttribute 2 { 3 public override void OnActionExecuted(ActionExecutedContext filterContext) 4 { 5 var actionFilters = filterContext.ActionDescriptor.GetCustomAttributes(false);//擷取所有的描述符 6 7 foreach (var item in actionFilters) 8 { 9 if (item.GetType().Name == "AllowAnonymousAttribute")//如果描述符類型中有AllowAnonymousAttribute(AllowAnonymous類型的名字),就直接存取,不需要驗證10 {11 return;12 }13 } 14 HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//擷取當前請求的所有cookie中名為userinfo的cookie15 16 if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判斷帳號密碼資訊17 {18 filterContext.Result = new RedirectResult("/Account/Login");//若帳號密碼為null或者cookie不存在,即返回登入頁面19 }20 }21 }
這樣,我們就可以實現匿名登入,不需要驗證cookie,就可以登陸一些頁面.
最後,對於需要驗證當前訪問者的資訊,那麼根據取到的cookie中的帳號資訊,很容易就可以在資料庫中找到,這裡就不予說明.另外,登出帳號,也可以通過到期cookie實現.
ps:才接觸電腦程式,也是第一次寫部落格.感覺寫部落格是很有必要的,這是一個思考學習的過程,解決問題並不是結束,能夠把它寫下來,講解給別人去解決問題,才是一個完美的結束!不過很遺憾,這次我沒有做到!功力有限,積極極受大家的指正批評!
參考內容:
http://blog.csdn.net/jin3226390/article/details/3245519(cookie的操作詳解)
http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html(MVC自訂過濾器)
ASP.NET中cookie與Fiter實現簡單登陸,AllowAnonymous匿名登陸