• 过滤器


    个人理解: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属性注入

  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9593681.html
Copyright © 2020-2023  润新知