ASP.NET MVC 過濾、異常過濾器


記錄下過濾器的學習—_—

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時由於拋出異常會跳轉到特定的視圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM