asp.net mvc框架之Filter的使用


1.四種Filter

  在asp.net mvc中提供了四種Filter(過濾器)接口實現了這種AOP機制:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。

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

b.IActionFilter:在每個Action被執行前執行OnActionExecuting方法,每個Action執行完成后執行OnActionExecuted方法。和IAuthorizationFilter的區別在於IAuthorzationFilter在IActionFilter之前執行。

c.IResultFilter:在每個ActionResult的前后執行IResultFilter。

d.IExceptionFilter:當Action執行發生未處理異常的時候執行OnException方法。

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

 

IAuthorizationFilter接口的使用

登錄權限案例

1.定義兩個控制器,登錄過濾器(LoginController)、登錄成功后的過濾器(MainController)

public class LoginController : Controller
    {
        // GET: Login
        public ActionResult Index()
        {
            //請求登錄界面
            return View();
        }

        //提交登錄
        public ActionResult Login(string txtName,string txtPwd)
        {
            if (txtName=="admin"&&txtPwd=="123")
            {
                Session["User"] = txtName;
                return Content("登錄成功!" + Session["User"]);
            }
            return Content("登錄失敗");
        }
    }
//登錄成功后才能訪問
    public class MainController : Controller
    {
        // GET: Main
        public ActionResult Index()
        {
            return Content("歡迎登錄!"+Session["User"]);
        }

        public ActionResult Success()
        {
            return Content("主界面"+Session["User"]);
        }
    }
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        <form action="~/Login/Login" method="post">
            <input type="text" name="txtName" /><br/>
            <input type="text" name="txtPwd" /><br/>
            <input type="submit" value="登錄"/>
        </form>
    </div>
</body>
</html>

2.定義實現IAuthorizationFilter接口的類

public class CheckLoginFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            //獲取控制器名字
            string controllerName=filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            //獲取Action方法的名字
            string actionName = filterContext.ActionDescriptor.ActionName;
            if (controllerName.ToLower()=="Login".ToLower()&&(actionName.ToLower()=="Login".ToLower()||actionName.ToLower()=="Index".ToLower()))
            {
                //什么都不做
            }
            else
            {
                if (filterContext.HttpContext.Session["User"]==null)
                {
                    ContentResult contentResult = new ContentResult();
                    contentResult.Content = "沒有登錄!";
                    //當執行filterContext.Result后,url中沒有權限的路徑就無法執行Action的方法了,就是阻止了沒有權限的Action方法
                    filterContext.Result = contentResult;
                }
            }
        }
    }

重定向:filterContext.Result = new RedirectResult("/login/index");或filterContext.HttpContext.Response.Redirect("/login/index");

第二個重定向不建議使用

3.在Global中添加GlobalFilters.Filters.Add(new CheckLoginFilter());

 

IExceptionFilter接口的使用

用法和IAuthorizationFilter接口用法一致,捕獲異常:Exception ex= filterContext.Exception;


免責聲明!

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



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