asp.net

asp.net mvc框架之Filter的使用

2024-01-16


四种Filter


  在asp.net mvc中提供了四种Filter(过滤器)接口实现了这种AOP机制:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。


1)IAuthorizationFilter:在每个Action被执行前执行OnAuthorization方法,一般用来检查当前用户是否具有Action的执行权限。


2)IActionFilter:在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法。和IAuthorizationFilter的区别在于IAuthorzationFilter在IActionFilter之前执行。


3)IResultFilter:在每个ActionResult的前后执行IResultFilter。


4)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;