1. 程式人生 > >MVC基本型別的過濾器

MVC基本型別的過濾器

過濾器在mvc中發揮著很重要的作用

過濾器(Filters)的出現使得我們可以在ASP.NET MVC程式裡更好的控制瀏覽器請求過來的URL,不是每個請求都會響應內容,只響應特定內容給那些有特定許可權的使用者,過濾器理論上有以下功能:

判斷登入與否或使用者許可權
決策輸出快取
防盜鏈
防蜘蛛
本地化與國際化設定
實現動態Action(做許可權管理系統的好東西)

 

過濾器型別 介面 預設實現繼承類 功能描述
Action IActionFilter ActionFilterAttribute 在動作方法之前及之後執行
Result IResultFilter ActionFilterAttribute 在動作結果被執行之前和之後執行
AuthorizationFilter IAuthorizationFilter AuthorizeAttribute 首先執行,在任何其它過濾器動作方法之前執行
Exception IExceptionFilter HandleErrorAttribute 只在另外一個過濾器,動作方法,動作結果彈出異常時執行

 

 

一、Action過濾器

       Action過濾器和Result過濾器我在這裡是一起新增

首先說一下Action過濾器;主要負責在動作方法之前及之後執行(動作,方法許可權)

       1、ActionAttribute過濾器繼承ActionFilterAttribute類

       2、ActionAttribute過濾器呼叫IActionFilter介面

       3、重寫OnActionExecuting方法;此方法是在Action動作方法執行前

       4、重寫OnActionExecuted方法;此方法是在Action動作方法執行後

Result過濾器;在動作結果被執行之前和之後執行 (結果許可權)

       1、ActionAttribute過濾器繼承ActionFilterAttribute類(和Action繼承成的同一個基類)

       2、ActionAttribute過濾器呼叫IResultFilter介面

       2、重寫OnResultExecuting方法;此方法是在執行操作結果前

       3、重寫OnActionExecuted方法;此方法是在執行操作結果前

程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCcation.Filters
{
    //Action在動作方法之前及之後執行
    public class ActionAttribute: ActionFilterAttribute, IActionFilter
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            //base.OnResultExecuting(filterContext);
            filterContext.HttpContext.Response.Write("在執行操作結果前");
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            //base.OnResultExecuted(filterContext);
            filterContext.HttpContext.Response.Write("在執行操作結果後");
        }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //base.OnActionExecuting(filterContext);
            filterContext.HttpContext.Response.Write("在Action方法執行前");
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //base.OnActionExecuted(filterContext);
            filterContext.HttpContext.Response.Write("在Action方法執行後<br/>");
        }
    }
}

接下來就在控制器中過濾器;這裡我選擇index檢視,所以在index控制器上面新增過濾器

using MVCcation.Filters;//引用過濾器檔案目錄
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCcation.Controllers
{
    public class HomeController : Controller
    {
        [Action]//(執行動作和操作)動作處理器
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

可以看出Action會在方法執行前後輸出,也在Result前面輸出

 

二、AuthorizationFilte過濾器

   首先執行,在任何其它過濾器動作方法之前執行(授許可權)

       1、AuthorizationFilte過濾器繼承AuthorizeAttribute類

       2、AuthorizationFilte過濾器呼叫IAuthorizationFilter介面

       3、用Request["userType"]是否是vip;如果是測可以訪問,否則就跳轉到百度

       4、在Index控制器中新增 [AuthorizationFilterAttribute("vip")]//(授權過濾器)只有Vip角色才能進行訪問Index檢視

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCcation.Filters
{
    //過濾器一般以Attribute結尾
    //[添加註解][過濾器型別]
    //授權過濾器AuthorizationFilter 繼承預設介面AuthorizAttribute
    public class AuthorizationFilterAttribute: AuthorizeAttribute,IAuthorizationFilter
    {
        public AuthorizationFilterAttribute(string usertype)
        {
            Roles = usertype;
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            string userType = HttpContext.Current.Request["userType"];
            if (userType!="vip")
            {
                filterContext.Result = new RedirectResult("http://www.baidu.com");
            }
            else
                Roles.Contains(userType);
            //base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

三、Exception過濾器(異常處理)

   只在另外一個過濾器,動作方法,動作結果彈出異常時執行(異常處理許可權)

       1、Exception過濾器繼承HandleErrorAttribute類

       2、Exception過濾器呼叫IExceptionFilter介面

       3、當用戶或者訪問者訪問自身沒有許可權訪問頁面,程式會丟擲一個錯誤然後,Exception過濾器處理這個錯誤後會丟擲一個沒有許可權的提示,這裡處理錯誤我是設定跳轉到一個網址

       4、還是在Index檢視控制器上新增ExceptionAttribute過濾器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; 
namespace MVCcation.Filters
{
    public class ExceptionAttribute:HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)//發生異常時呼叫http://www.hermanboke.cn
        {
            if (!filterContext.ExceptionHandled)
            {
                filterContext.Result = new RedirectResult("http://www.hermanboke.cn");//出現錯誤後跳轉到這個網址
                filterContext.ExceptionHandled = true;
            }
            base.OnException(filterContext);
        }
    }
}

這裡我們要在Index控制器裡面故意丟擲一個錯誤,來讓Exception過濾器處理

 throw new DllNotFoundException();//丟擲一個異常

        [AuthorizationFilterAttribute("vip")]//(授權過濾器)只有Vip角色才能進行訪問Index檢視
        [Action]//(執行動作和操作)動作處理器
        [Exception]//(錯誤日誌處理器)
        public ActionResult Index()
        {
            throw new DllNotFoundException();//丟擲一個異常
            return View();
        }

然後執行index檢視;在瀏覽器中輸入http://localhost:50003/Home/Index?userType=vip就會跳轉到指定錯誤的頁面