ASP.NET MVC 學習筆記之面向切面編程與過濾器


AOP(面向切面)是一種架構思想,用於把公共的邏輯放到一個單獨的地方,這樣就不用每個地方都寫重復的代碼了。比如程序中發生異常,不用每個地方都try…catch 只要在GolbalApplication_Error中統一進行異常處理。 

不用每個Action中都檢查當前用戶是否有執行權限。ASP.NETMVC 中提供了一個機制,每個Action執行之前我們都會執行我們的代碼,這樣統一檢查即可。 

一夫當關萬夫莫開! 

  

四種Filter 

ASP.NET MVC中提供了四個Filter(過濾器)接口實現了 這種AOP機制,IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter 

  1. IAuthorizationFilter 一般用來檢查當前用戶是否有Action的執行權限,在每個Action被執行之前執行OnAuthorization方法 

  2. IActionFilter也是在每個Action被執行前執行OnActionExecuting方法,每個Action執行完成后執行OnActionExecuted方法,和IAuthorizationFilter的區別是IAuthorizationFilterIActionFilter這樣,檢查權限一般寫到IAuthorzationFilter 

  3. IResultFilter,在每個ActionResult的前后執行IResultFilter。用的很少 

  4. IExceptionFilter,當Action執行發生未處理異常的時候執行OnException方法,在MVC中仍然可以使用Global Application_Error 但建議使用IExceptionFilter 

定義的自定義Filter 可以在Global GlobalFilters.Filters.Add(new XXXFilter());的方式添加為全局的過濾器、。 

 

示例:

CheckLoginFilter

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

namespace WebMVC.Filters
{
    public class CheckLoginFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            string ctrlName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            string actionName = filterContext.ActionDescriptor.ActionName;
            if(ctrlName == "Login" &&(actionName == "Index" || actionName == "Login"))
            {
                //什么都不做
            }
            else
            {
                
                if(filterContext.HttpContext.Session["username"] == null)
                {
                    filterContext.Result = new RedirectResult("/Login/Index)");
                }
                else
                {
                    if(filterContext.HttpContext.Session["username"].ToString() != "a")
                    {
                        ContentResult result = new ContentResult();
                        result.Content = "沒有權限";
                        filterContext.Result = result;
                    }
                }
            }
        }
    }
}

在Global中添加全局過濾器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using WebMVC.Filters;
namespace WebMVC
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalFilters.Filters.Add(new CheckLoginFilter());
        }
    }
}

 


免責聲明!

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



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