• MVC基础知识2——过滤器的使用(Filter)


    过滤器(Filter)

      AOP (面向切面编程)是一种架构思想,用于把公共的逻辑放到一个单独的地方,这样就不用每个地方都写重复的代码了。 比如程序中发生异常,都 不用每个地方都 try...catch... 只要在(Global 的 的 Application_Error )中 统一进行 异常处理个 。

    四种 Filter:

    在 在 ASP.Net MVC 个 中提供了四个 Filter (过滤器) 接口种 实现了这种 AOP 机制 :
    IAuthorizationFilter 、IActionFilter 、IResultFilter 、IExceptionFilter 。
    1 )IAuthorizationFilter 一般用来检查当前用户是否有 Action 的执行权限 ,在个 每个 Action 被
    执行前执行 OnAuthorization 方法 ;
    2 )IActionFilter 也是在 每个 Action 被执行前执行 OnActionExecuting 方法 , 每个 Action 执行
    完成后执行 OnActionExecuted 方法。和 和 IAuthorizationFilter 的区别是 IAuthorizationFilter 在
    IActionFilter 之前执行 ,检查权限一般写到 IAuthorizationFilter 中 ;
    3) )IResultFilter ,在 每个 ActionResult 的前后执行 IResultFilter 。用的很少, , 后面有一个应用。
    4) )IExceptionFilter ,当 Action 执行发生未处理异常的时候执行 OnException 方法。 。在 在 ASP.net
    MVC 中仍然可以使用 “Global 的 的 Application_Error ”,但是建议用 IExceptionFilter 。
    定义的类可以在Global 中GlobalFilters.Filters.Add(new XXXFilter()); 的方式添加为全局的
    过滤器'

    实例:

    定义的类可以在Global 中GlobalFilters.Filters.Add(new XXXFilter()); 的方式添加为全局的
    过滤器。
    2 、IAuthorizationFilter 案例 : 只有登录后才能访问除了 LoginController 之外的 Controller 。
    1) ) 编写一个类 CheckAuthorFilter ,实现 IAuthorizationFilter 接口
    2) ) 在 在 Global 中注册这个 Filter :GlobalFilters.Filters.Add(new CheckAuthorFilter());
    3) ) CheckAuthorFilter 中实现 OnAuthorization 方法。filterContext.ActionDescriptor 可以获得
    Action 的信息:filterContext.ActionDescriptor.ActionName 获得要执行的 Action 的名字;
    filterContext.ActionDescriptor.ControllerDescriptor.ControllerName 为要执行的 Controller
    的名字;filterContext.ActionDescriptor.ControllerDescriptor.ControllerType 为要执行的
    Controller 的 的 Type ;filterContext.HttpContext 的 获得当前请求的 HttpContext ; 如果给
    “ “ filterContext.Result ” 赋值 了, 那么 就不 会再执 行的 要 执行 的 Action , 而是 以
    “ “ filterContext.Result ” 的 值 作 为 执 行 结 果 ( 注 意 如 果 是 执 行 的
    filterContext.HttpContext.Response.Redirect() ,那么目标 Action 还会执行的)。
    4) ) 则 检查当前用户是否登录,如果没有登录则 filterContext.Result = new ContentResult()
    { Content = " 没有权限" }; 或者 filterContext.Result = new RedirectResult("/Login/Index");
    (最好不要 filterContext.HttpContext.Response.Redirect("/Login/Index"); )
    5) ) A 用户有一些 Action 执行权限,B 用户有另外一些 Action 的执行权限;
    3 、IActionFilter 案例: 日志记录,记录登录用户执行的 Action 的记录,方便跟踪责任。
    4 、IExceptionFilter:记录未捕获异常

    public class ExceptionFilter : IExceptionFilter
    {
    public void OnException(ExceptionContext filterContext)
    {
    File.AppendAllText("d:/error.log", filterContext.Exception.ToString());
    filterContext.ExceptionHandled = true;// 如果有其他的 IExceptionFilter  不再执行
    filterContext.Result = new ContentResult() { Content= "error" };
    }
    }
    GlobalFilters.Filters.Add(new ExceptionFilter());//
    然后
     

     总结好处:一次编写,其他地方默认就执行了。 可以添加多个同一个类型的全局 Filter ,
    按照添加的顺序执行。
    非全局 Filter :自 只要让实现类继承自 FilterAttribute 类,然后该实现哪个 Filter 接口就
    到 实现哪个(四个都支持)。不添加到 GlobalFilters 中,而是义 把这个自定义 Attribute 添加到
    Controller 类上这样就只有这个 Controller 中操作会用到这个 Filter 。如果添加到 Action 方法
    上,则只有这个 Action 执行的时候才会用到这个 Filter

  • 相关阅读:
    python Elementtree 生成带缩进格式的xml文件
    Tacotron2论文阅读笔记
    opencv3 7.3 重映射 仿射变换
    numpy.ndarray类型方法
    ubuntu安装百度输入法
    gitlab--cicd实践pytest和flask接口化
    django搭建完毕运行显示hello django
    django搭建
    服务器内存
    python安装第三方库aiohtpp,sanio失败,pip install multidict 失败问题
  • 原文地址:https://www.cnblogs.com/lyfingchow/p/6575149.html
Copyright © 2020-2023  润新知