zoukankan      html  css  js  c++  java
  • 过滤器

    个人理解:Asp.net过滤器,其实就是在ControllerActionInvoker中放置了供用户注入对客户请求处理的对象(是个集合收集收入注入的处理对象),根据处理的时机不同分为5中处理对象。

    过滤器的定义

    过滤器:就是服务器对用户请求的处理流程中设置过滤(如设置是否继续处理,还是返回等操作)。Asp.net MVC的过滤器设置基于AOP设计,在一些非业务的逻辑在过滤其中实现。
    Asp.net MVC中主要执行流程在ControllerActionInvoker中,即在ControllerActionInvoker执行中会调用过滤器。其中有5种过滤器,如果自定义需要实现某个中过滤器的接口。
    注意 如果自定的过滤器执行需要注入

    过滤器的提供机制

    为了方便用户实现自己的过滤并注入,这里采用同ModelMetadata ModelBinder ModelValidator注入方式。

    Filter

    Filter是对过滤器的封装,其中Instance为真正的过滤器,其中Order为同种过滤器多个的执行顺序,Scope为过滤器范围。

    FilterProvider

    IFilterProviderFilter的提供者,系统提供三种。
    FilterProviders静态类包括IFilterProvider类型的集合,当查找Filter时通过遍历所有IFilterProvider得到的所有符合的Filter

    提供器名 原理
    FilterAttributeFilterProvider 实现FilterAttribute类,通过ControllerDescriptorActionDescriptor得到特性在提取
    ControllerInstanceFilterProvider Controller实现过滤器,将Controller封装到Filter
    GlobalFilterCollection Filter添加到静态集合

    注入方式

    注入方式即怎样才能被上面三种IFilterProvider得到

    • 过滤器继承FilterAttribute,在需要的ControllerAction上标注
    • 重写Controller过滤器调用过滤方法(这种不需要定义过滤器,但复用好,每个Controller都需重写)
    • 将定义的Filter直接加入GlobalFilterCollection

    过滤器的执行

    过滤器是怎样在ControllerActionInvoker中调用的呢?

    • 首先FilterProviders.Providers.GetFilters获得所有的过滤器
    • FilterInfo通过IOverrideFilter将过滤器分为5类,(对Filter中的Instance的类型判断,这里没法利用泛型因每种过滤器的方法不同)
    • 在不同的时机调用不同的过滤器

    五种过滤器

    IAuthenticationFilter

    为用户的认证,AuthenticationContext继承ControllerContext,所有可以利用Respose将登陆成功的票据发给客户端,如果合法请求可设置ControllerContext
    通过:AuthenticationAttribute属性方式注入

     public interface IAuthenticationFilter
        {
            //根据用户请求实施认证
            void OnAuthentication(AuthenticationContext filterContext);
            //将认证发送给用户 一般不需要重写
            void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);
        }
    

    IAuthorizationFilter

    授权检验,对认证的用户角色验证

       public interface IAuthorizationFilter
        {
            void OnAuthorization(AuthorizationContext filterContext);
        }
    

    系统提供的有:

    • AuthorizationAttribute标注角色认证
    • RequireHttpsAttribute https重定向
    • ValidateInputAttribute 对用户输入验证
    • ValidateAntiForgeryTokenAttribute防止跨站点请求伪造
    • ChildActionOnlyAttributeController下某个方法不可以通过http直接调用,可用View中调用作为部分html

    IActionFilter

    IActionFilter是在Action的执行前后过滤

       public interface IActionFilter
        {
            void OnActionExecuting(ActionExecutingContext filterContext);
            void OnActionExecuted(ActionExecutedContext filterContext);
        }
    

    通过属性ActionFilterAttribute注入

    IExceptionFilter

    异常过滤器,从认证用户到整个方法执行出现异常触发

    public interface IExceptionFilter
        {
            void OnException(ExceptionContext filterContext);
        }
    

    通过HandleErrorAttribute注入方法

    IResultFilter

    View呈现时前后执行

        public interface IResultFilter
        {
            void OnResultExecuting(ResultExecutingContext filterContext);
            void OnResultExecuted(ResultExecutedContext filterContext);
        }
    

    通过ActionFilterAttribute属性注入

  • 相关阅读:
    将文件移出版本控制 (Revision Control)
    luogu 1966 火柴排队
    bzoj 1069 最大土地面积
    bzoj 1060 时态同步
    luogu 1901 发射站
    bzoj 1007 水平可见直线
    bzoj 2654 tree
    luogu 2024 食物链
    10.21 模拟赛
    tyvj 1013 找啊找啊找GF
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9593681.html
Copyright © 2011-2022 走看看