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());
            }
        }
    }
  • 相关阅读:
    Vue 异步组件按需加载
    Net core 连接 Minio 出现 Access Denied 错误
    vue 脚手架打包 生成时间戳版本号
    vue tab 切换动画
    想尽办法不出错的语言太可怕了
    .NET Core:处理全局异常
    C#获取当前路径的方法
    [C#]解决生成的缩略图模糊的问题
    C# 正则表达式 —— 中文/英文空格(全角/半角空格)处理
    用C# 7.0的switch...case模式匹配取代一堆if语句
  • 原文地址:https://www.cnblogs.com/c-supreme/p/9517630.html
Copyright © 2011-2022 走看看