zoukankan      html  css  js  c++  java
  • ASP.NET MVC 学习笔记之面向切面编程与过滤器

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

    不用每个Action中都检查当前用户是否有执行权限。ASP.NETMVC 中提供了一个机制,每个Action执行之前我们都会执行我们的代码,这样统一检查即可。 

    一夫当关万夫莫开! 

      

    四种Filter 

    ASP.NET MVC中提供了四个Filter(过滤器)接口实现了 这种AOP机制,IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter 

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

    2. IActionFilter也是在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法,和IAuthorizationFilter的区别是IAuthorizationFilterIActionFilter这样,检查权限一般写到IAuthorzationFilter 

    3. IResultFilter,在每个ActionResult的前后执行IResultFilter。用的很少 

    4. IExceptionFilter,当Action执行发生未处理异常的时候执行OnException方法,在MVC中仍然可以使用Global Application_Error 但建议使用IExceptionFilter 

    定义的自定义Filter 可以在Global GlobalFilters.Filters.Add(new XXXFilter());的方式添加为全局的过滤器、。 

     

    示例:

    CheckLoginFilter

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace WebMVC.Filters
    {
        public class CheckLoginFilter : IAuthorizationFilter
        {
            public void OnAuthorization(AuthorizationContext filterContext)
            {
                string ctrlName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                string actionName = filterContext.ActionDescriptor.ActionName;
                if(ctrlName == "Login" &&(actionName == "Index" || actionName == "Login"))
                {
                    //什么都不做
                }
                else
                {
                    
                    if(filterContext.HttpContext.Session["username"] == null)
                    {
                        filterContext.Result = new RedirectResult("/Login/Index)");
                    }
                    else
                    {
                        if(filterContext.HttpContext.Session["username"].ToString() != "a")
                        {
                            ContentResult result = new ContentResult();
                            result.Content = "没有权限";
                            filterContext.Result = result;
                        }
                    }
                }
            }
        }
    }

    在Global中添加全局过滤器

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    using WebMVC.Filters;
    namespace WebMVC
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                GlobalFilters.Filters.Add(new CheckLoginFilter());
            }
        }
    }
  • 相关阅读:
    [CF149D] Coloring Brackets(区间dp)
    [CF1437E] Make It Increasing(LIS)
    洛谷试题之跳石头
    【模板】深搜和广搜
    高精度阶乘
    【模板】拓扑排序
    【模板】最小生成树——Kruskal算法
    判断素数的方法
    高精度乘法
    高精度加法
  • 原文地址:https://www.cnblogs.com/c-supreme/p/9517630.html
Copyright © 2011-2022 走看看