記錄下過濾器的學習—_—
APS.NET MVC中的每一個請求,都會分配給相應的控制器和對應的行為方法去處理,而在這些處理的前后如果想再加一些額外的邏輯處理,這樣會造成大量代碼的重復使用,這不是我們希望的。這時就到了過濾器出場的時候啦。
但是默認實現它們的過濾器只有三種,分別是Authorize(授權),ActionFilter,HandleError(錯誤處理);
各種信息如下表所示
過濾器 | 類名 | 實現接口 | 描述 |
ActionFilter | AuthorizeAttribute | IAuthorizationFilter | 此類型(或過濾器)用於限制進入控制器或控制器的某個行為方法 |
HandleError | HandleErrorAttribute | IExceptionFilter | 用於指定一個行為,這個被指定的行為處理某個行為方法或某個控制器里面拋出的異常 |
自定義 | ActionFilterAttribute | IActionFilter和IResultFilter | 用於進入行為之前或之后的處理或返回結果的之前或之后的處理 AuthorizeAttribute過濾器 |
首先,我們需要搞清楚什么是過濾器,簡單的說過濾器也是一個類,這個類繼承自過濾器類
public class MyAuthorizeAttribute:AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { //... } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { //... } }
然后用到方法上
[MyAuthorize] public ActionResult Show() { return View(); }
上述用到的是一個自定義授權驗證規則,當然如果默認的Authorize過濾器足夠我們使用我們也可以使用默認的Authorize,想要自己定義一個自定義授權類可以繼承AuthorizeAttribute類,然后重寫兩個方法:
- bool AuthorizeCore(HttpContextBase httpContext):這里主要是授權驗證的邏輯處理,返回true的則是通過授權,返回了false則不是。
- void HandleUnauthorizedRequest(AuthorizationContext filterContext):這個方法是處理授權失敗的事情。
例如:我們可以在AuthorizeCore中確認是否授權
return base.AuthorizeCore(httpContext);
在授權失敗類中返回到登陸。。。
在登陸驗證成功后跳轉頁面前完成授權
FormsAuthentication.SetAuthCookie(login.UserName, false);
注銷
FormsAuthentication.SignOut();
當然注銷實在登陸后發生的,所以注銷時也要加上[Authorize]授權
登陸頁
@model FilterTest.Models.LogInModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>登陸</title> </head> <body> <div> @using( Html.BeginForm()) { <div> ID:@Html.TextBoxFor(m=>m.Uid) <br /> Password:@Html.PasswordFor(m => m.Pwd) <br /> <input type="submit" value="登陸" /></div> } </div> </body> </html>
[HttpPost]//這里用了謂詞過濾器,只處理POST的請求 public ActionResult Login(LogInModel login) { if (login.Uid== "admin" && login.Pwd == "123456") { FormsAuthentication.SetAuthCookie(login.UserName, false); return Redirect("/跳轉頁。。。"); } return View(); }
注銷
[Authorize] public ActionResult LogOut() { FormsAuthentication.SignOut(); return Redirect("/登陸頁。。。"); }
Exception過濾器
創建MyHandleErrorAttribute類,繼承HandleErrorAttribute類:
public class MyHandleErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { Exception ex = filterContext.Exception; //寫日志 //Log filterContext.Result = new RedirectResult("~/error.html"); filterContext.ExceptionHandled = true; base.OnException(filterContext); }
然后使用MyHandleErrorAttribute類
[MyHandleErrorAttribute] public ActionResult GetErr() { throw new Exception("this is ThrowErrorLogin Action Throw"); }
跳轉不了還要到web.config文件中的<system.web>一節中添加以下代碼
<customErrors mode="On" />
當訪問這里的GetErr時由於拋出異常會跳轉到特定的視圖。