.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 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
随机推荐
- Kafka0.8.2删除topic逻辑(转)
原文链接:Kafka0.8.2.1删除topic逻辑 前提条件: 在启动broker时候开启删除topic的开关,即在server.properties中添加: delete.topic.enabl ...
- Vxlan基础理解
一 . 为什么需要Vxlan 1. vlan的数量限制 4096个vlan远不能满足大规模云计算数据中心的需求 2. 物理网络基础设施的限制 基于IP子网的区域划分限制了需要二层网 ...
- acrgis 解决矢量转栅格分辨率过大造成连续值变离散且出现空白
目标:解决北京河流矢量polygon 转栅格的问题 设置栅格大小和影像一致30*30----结果发现,因为cell过大,原本连续的是矢量面变得不连续了,特别细的河流会出现间断(如下图所示): 1号 网 ...
- 官网下载MySQL最新版本的安装包
下载地址:http://www.mysql.com/downloads/ 1.选择下载社区版本 MySQL Community Edition (GPL)Community (GPL) Downloa ...
- ssh: connect to host gitlab.alpha.com port 22: Network is unreachable
在这里只说明我遇到的问题和解决方法,可能并不能解决你遇到的问题: git clone git@gitlab.alpha.com:ipcam/ambarella.gitCloning into 'amb ...
- php字符串统计次数的各种方法(转)
<?php $str = 'AbCdEfGaBcDeFgH0234;,!-AaBbCcDdEeFfGg'; $str = strtoupper($str); // 不区分大小写时,全部转换成大写 ...
- Linux下使用Nginx代理访问json文件报404错误
在网上看了很多,都说是IIS的问题,关键是使用servlet就可以正常访问,使用Nginx就不行,最后发现是其他问题,解决方案如下: 1.确认配置的路径是否正确,Nginx代理的路径和你访问的路径. ...
- 我的代码-models
# coding: utf-8 # In[1]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn.s ...
- js正则表达式讲的最好的
https://www.cnblogs.com/chenmeng0818/p/6370819.html
- zabbix_agent添加到系统服务启动(八)
Centos6.5上安装了zabbix_agent后,需要把zabbix_agent添加到系统服务启动,要不然每次要一长串路径再启动,挺麻烦的. 步骤: 1)拷贝zabbix解压包里的zabbix_a ...