.NET MVC 过滤器使用
来看以下两种情况
1. 如果我们需要对某个模块做权限控制,通常的做法是写一个基类(BaseController),让这个基类继承Controller类,在BaseController的构造方法中进行权限校验的操作,然后让需要进行校验的类继承 BaseController
2. 如果我们需要自定义错误异常处理,固然我们可以对可能出错的地方都写上 try catch ,但是这几乎不可能实现,因为很多错误我们自己也无法预知
在.net MVC中给我们提供了一种解决方案,那就是过滤器
.net framework给我们提供了四种不同类型过滤器
| 过滤器类型 | 实现接口 | 默认实现 | 重写方法 | 描述 |
| Authorization | IAuthorizationFilter | AuthorizeAttribute | OnAuthorization | 在方法和所有过滤器前执行 |
| Action | IActionFilter | ActionFilterAttribute |
OnActionExecuting OnActionExecuted |
方法执行之前和之后 |
| Result | IResultFilter | ActionFilterAttribute |
OnResultExecuted OnResultExecuting |
结果执行之前和之后 |
| Exception | IExceptionFilter | HandleErrorAttribute | OnException | 抛出异常时执行 |
过滤器两种定义方式:
1. 单独建立一个过滤器类,然后在需要使用该过滤器的方法或者类前面使用特征的方式加上该过滤器,或者使用全局注册的方式 (推荐)
权限校验:
public class MyAuthorization:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//RouteData 获取路由数据
List<KeyValuePair<string, object>> router_data = filterContext.RouteData.Values.ToList(); //在这里进行权限判断,如果具备权限,则跳转到错误页面
filterContext.HttpContext.Response.Write("检查权限"); //跳转到 Auth 控制器下 Login 方法
filterContext.Result = new RedirectResult("Auth/Login"); //这种跳转方法不会终止程序执行
//filterContext.HttpContext.Response.Redirect("Auth/Login") //注释掉此行代码,否则将执行系统定义的过滤器
//base.OnAuthorization(filterContext);
}
//在需要进行权限校验的方法或者类前面加上该过滤器
[MyAuthorization]
public ActionResult Index()
{
return View();
}
异常处理:
public override void OnException(ExceptionContext filterContext)
{
//日志记录,然后跳转到错误页
filterContext.Result = new RedirectResult("/error/400.html"); //这行代码不可以被删除 否则捕捉不到异常
base.OnException(filterContext);
}
然后在 App_Start/FilterConfig.cs 中全局注册
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//注释掉系统注册的全局异常处理
//filters.Add(new HandleErrorAttribute()); filters.Add(new MyException());
}
最后需要在根目录 web.config中开启自定义异常处理
//在 system.web 节点中添加 <customErrors mode="On">
</customErrors>
2. 在控制器中重写对应方法,然后改控制器下所有方法都会自动使用该控制器
protected override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("这是控制器中重写的方法");
}
.NET MVC 过滤器使用的更多相关文章
- mvc过滤器学习(1)
mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...
- ASP.NET MVC 过滤器(一)
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- ASP.NET MVC 过滤器(三)
ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...
- ASP.NET MVC 过滤器(四)
ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...
- ASP.NET MVC 过滤器(五)
ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- MVC过滤器详解
MVC过滤器详解 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...
- MVC过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- ASP.NET MVC 过滤器详解
http://www.fwqtg.net/asp-net-mvc-%E8%BF%87%E6%BB%A4%E5%99%A8%E8%AF%A6%E8%A7%A3.html 我经历了过滤器的苦难,我想到了还 ...
- ASP.NET MVC过滤器(一)
MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
随机推荐
- java readProperties
@Deprecated public static Map<String, String> readProperties(String propertiesFile) { Properti ...
- My SQL随记 002 登陆
如何启动MySQL服务 Step1 我的电脑右键属性找到 控制面板 选择 系统和安全 Step2 管理工具中找到服务 Step3 找到你的MySQL启动服务 如何通过黑窗口登陆退出 MySQL Ste ...
- Python 进程池的同步方法
import time from multiprocessing import Process,Pool def f1(n): time.sleep(1) #print(n) return n*n i ...
- 关于测绘软件南方CASS(7.0)成图系统的使用心得
关于测绘软件南方CASS(7.0)成图系统的使用心得 王天池 南方CASS是一款基于CAD平台开发的一套集地形地籍空间数据建库工程工程应用土石算量等功能为一体的绘图软件. 初识这款软件是在大二校园 ...
- 判断是不是微信浏览器和QQ内置浏览器
is_weixn() { let ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "mi ...
- 使用Jackson解析首字母大写的json字符串
Jackson在解析返回的json字符串时始终报错,纠结很久之后才找到原因,原来是是由于json字符串中的字母都是首字母大写,导致jackson找不到相应的KEY. 在项目中经常使用从服务器获取的数据 ...
- AFN 二次封装
#import "YQDataManager.h" #import <YYModel/YYModel.h> #pragma mark - 数据model基类 @impl ...
- MYSQL之IFNULL
IFNULL是MYSQL中的一个判断字段值是否为null的函数,如果为null,则此查询可以变更为指定的值: 如 IFNULL(a,0) 如果a为null,则查询出0. 如果A表中没有数据 sele ...
- js 在线引用
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- jQuery基础(三)事件
1.鼠标事件 jQuery鼠标事件之click与dblclick事件 click方法用于监听用户单击操作,dbclick方法用于监听用户双击操作. 方法一:$ele.click() 绑定$ele元素, ...