ASP.NET mvc4中的过滤器的使用
mvc4中的过滤器
过滤器(Filter)把附加逻辑注入到MVC框架的请求处理。实现了交叉关注。
交叉关注:用于整个应用程序,又不适合放在某个局部位置的功能。
过滤器是.NET的注解属性(Attribute),它们对请求处理管道添加了额外的步骤。
注解属性是派生于System.Attribute的特殊的.NET类。
可以被附加到类、方法、属性、字段等代码元素上。其目的是把附加信息嵌入到已编译的代码中,以便在运行时读回这些信息。
过滤器的基本类型:
过滤器类型 |
接口 |
默认实现 |
描述 |
Authorization |
IAuthorizationFilter |
AuthorizationAttribute |
最先运行 |
Action |
IActionFilter |
ActionFilterAttribute |
在动作方法前后运行 |
Result |
IResultFilter |
ActionResultAttribute |
在动作结果被执行前后 |
Exception |
IExceptionFilter |
HandlerErrorAttribute |
仅在过滤器、动作发生异常时 |
授权过滤器:IAuthorizationFilter
namespace System.Web.Mvc{ // 摘要:定义授权筛选器所需的方法。 public interface IAuthorizationFilter{ // 摘要:在需要授权时调用。 // 参数:filterContext:筛选器上下文。 void OnAuthorization(AuthorizationContext filterContext); } }
注意:
直接实现接口其实是一件非常危险的事;因此创建一个自定义AuthorizeAttribute子类,再实现授权代码比较容易。
public class CustomAuthAttribute:AuthorizeAttribute{ /// <summary> /// 是否对请求进行授权访问的方式 /// </summary> /// <param name="httpContext">对请求信息进行访问的方法</param> protected override bool AuthorizeCore(HttpContextBase httpContext){ return base.AuthorizeCore(httpContext); } }
直接实现IAuthorizationFilter接口的主要原因是为了获取对传递给OnAuthorization()的AuthorizationContext的访问,通过它可以获得更广泛的信息(路由细节、当前控制器和动作方法信息)。使用接口的方式不仅有安全风险且让授权注解属性中建立的逻辑与控制器紧密的耦合在一起,破坏关注分离,不便于维护。
内建的授权过滤器:
虽然使用了AuthorizeAttribute类作为自定义过滤器的基础,但其AuthorizeCore()有自己的实现
当直接使用AuthorizeAttribute时,可以使用它的public属性来指定授权策略
AuthorizeAttribute属性
名称 |
类型 |
描述 |
Users |
String |
一个逗号分隔的用户名列表,指定这些用户可以访问动作方法 |
Roles |
String |
一个逗号分隔的角色列表,用户必须至少有一个角色 |
public class HomeController : Controller{ [Authorize(Users ="admin,steve,jacqui",Roles ="admin")] public ActionResult Index(){ return View(); } }
异常过滤器:
namespace System.Web.Mvc{ // 摘要:定义异常筛选器所需的方法。 public interface IExceptionFilter{ // 摘要:在发生异常时调用。 // 参数:filterContext: // 筛选器上下文。 void OnException(ExceptionContext filterContext); } }
当一个未处理的异常出现时,OnException()被调用。该方法的参数是一个ExceptionContext 对象,此对象派生于ControllerContext,并提供了许多有用的属性。
名称 |
类型 |
描述 |
Controller |
ControllerBase |
返回请求的控制器对象 |
HttpContext |
HttpContextBase |
提供对请求细节的访问及对响应的访问 |
IsChildAction |
Bool |
若是自动做则返回true |
RequestContext |
RequestContext |
提供对HttpContext和路由数据的访问 |
RouteData |
RouteData |
返回请求的路由数据 |
继承自ControllerContext的属性
名称 |
类型 |
描述 |
ActionDescripter |
ActionDescripter |
提供动作方法的细节 |
Result |
ActionResult |
用于动作方法的结果,通过非空值可取消请求 |
Exception |
Exception |
未处理的异常 |
ExceptionHandled |
Bool |
如果另一个过滤器已经把这个异常标记为已处理则返回true |
实现自定义异常过滤器
public class RangeExceptionAttribute : FilterAttribute, IExceptionFilter{ public void OnException(ExceptionContext filterContext){ } }
使用内建的异常过滤器:
HandleErrorAttribute属性
名称 |
类型 |
描述 |
ExceptionType |
Type |
由过滤器处理的异常类型 |
View |
String |
该过滤器渲染的视图模板名 |
Master |
String |
在渲染这个过滤器的视图时使用的布局名称 |
准备工作:
在web.config文件中启用自定义错误时,HandleErrorAttribute过滤器才会生效,在<system.web>节点中添加一个customErrors属性即可;
<system.web> <!--定制错误页aa.html--> <customErrors mode="On" defaultRedirect="/Content/aa.html" /> </system.web>
Mode属性的默认值是RemoteOnly在开发期间,HandleErrorAttribute将不会拦截异常,但当应用程序部署到产品服务器时,并从另一台计算机发出请求时HandleErrorAttribute变生效
[HandleError(ExceptionType =typeof(ArgumentNullException),View ="Null")] public ActionResult Index(){ return View(); }
在渲染视图时HandleErrorAttribute过滤器会传递一个HandleErrorInfo视图模型对象这是一个封装了异常细节的封装程序
名称 |
类型 |
描述 |
ActionName |
String |
返回生成异常的Action名称 |
ControllerName |
String |
返回生成异常的Controller名称 |
Exception |
Exception |
返回此异常 |
@model HandleErrorInfo @{ ViewBag.Title = "Sorry"; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> </head> <body> @Model.Exception.StackTrace </body> </html>
备注:使用HandleError过滤器时一定要包含Model.Exception.StackTrace否则视图不会显示给用户,引用没必要给用户展示堆栈信息所以可以将该值放入div并隐藏
动作过滤器
用于任何目的的多用途过滤器
namespace System.Web.Mvc{ // 摘要:定义操作筛选器中使用的方法。 public interface IActionFilter{ // 摘要:在执行操作方法后调用。 // 参数:filterContext: // 筛选器上下文。 void OnActionExecuted(ActionExecutedContext filterContext); // 摘要:在执行操作方法之前调用。 // 参数:filterContext: // 筛选器上下文。 void OnActionExecuting(ActionExecutingContext filterContext); } }
ActionExecutingContext 属性
名称 |
类型 |
描述 |
ActionDescriptor |
ActionDescriptor |
动作方法的描述 |
Result |
ActionResult |
动作方法的结果,设置属性非空值,过滤器可以取消请求 |
ActionExecutedContext 属性
名称 |
类型 |
描述 |
ActionDescriptor |
ActionDescriptor |
动作方法的描述 |
Canceled |
Bool |
如果该动作被另一个过滤器取消,则返回true |
Exception |
Exception |
返回由另一个过滤器或动作方法抛出的异常 |
ExceptionHandled |
Bool |
如果异常被处理返回true |
Result |
ActionResult |
|
结果过滤器:
它会对动作方法所产生的结果进行操作
namespace System.Web.Mvc{ // 摘要:定义结果筛选器所需的方法。 public interface IResultFilter{ // 摘要:在操作结果执行后调用。 // 参数:filterContext: // 筛选器上下文。 void OnResultExecuted(ResultExecutedContext filterContext); // 摘要:在操作结果执行之前调用。 // 参数:filterContext: // 筛选器上下文。 void OnResultExecuting(ResultExecutingContext filterContext); } }
动作方法如何返回动作结果,让用户能够将动作方法的意图与动作方法的执行分离。将结果过滤器运用于一个动作方法时会在动作方法返回结果时、但在执行该动作结果之前调用OnResultExecuting。动作结果执行之后调用OnResultExecuted
内建的动作过滤器和结果过滤器
Mvc框架包含一个内建的类,可以用来创建动作过滤器和结果过滤器,这个类的名称ActionFilterAttribute
namespace System.Web.Mvc{ // 摘要:表示筛选器特性的基类。 public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter{ // 摘要:在执行操作方法后由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnActionExecuted(ActionExecutedContext filterContext); // 摘要:在执行操作方法之前由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnActionExecuting(ActionExecutingContext filterContext); // 摘要:在执行操作结果后由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnResultExecuted(ResultExecutedContext filterContext); // 摘要:在执行操作结果之前由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnResultExecuting(ResultExecutingContext filterContext); } }
使用这个类的唯一好处是不需要重写和实现不打算使用的方法。除此之外,直接实现过滤器接口没有任何好处
自定义实例:
public class ProfileAllAttribute: ActionFilterAttribute{ private Stopwatch timer; public override void OnActionExecuting(ActionExecutingContext filterContext){ timer = Stopwatch.StartNew(); } public override void OnActionExecuted(ActionExecutedContext filterContext){ timer.Stop(); filterContext.HttpContext.Response.Write( string.Format("<div>Total elapsed time:{0}</div>", timer.Elapsed.TotalSeconds)); } } public class HomeController : Controller{ [ProfileAll] public ActionResult Index(){ return View();} }
其它过滤器属性:
public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
过滤器的几种实现形式:
①全局过滤器
在FilterConfig中直接注册实现类
②实现接口
③注解
对过滤器执行排序
过滤器是按类型执行的其顺序:授权-》Action-》result。如果有未处理异常,框架在任一阶段都会执行异常过滤器
namespace System.Web.Mvc { // 摘要:表示操作和结果筛选器特性的基类。 public abstract class FilterAttribute : Attribute, IMvcFilter{ // 摘要: 获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。 // 返回结果:如果可指定筛选器特性的多个实例,则为 true;否则为 false。 public bool AllowMultiple { get; } // 摘要: 获取或者设置执行操作筛选器的顺序。 // 返回结果:执行操作筛选器的顺序。 public int Order { get; set; } } }
内建过滤器
过滤器 |
描述 |
RequireHttps |
强迫Action使用Https协议 |
OutputCache |
缓存一个Action的 |
ValidateInputand ValidationAntiForgeryToken |
与安全性有关的授权过滤器 |
AsyncTimeout NoAsyncTimeout |
用户异步控制器 |
ChildActionOnlyAttribute |
一个支持Html.action和Html.RenderAction辅助器方法的过滤器 |
RequireHttps
RequireHttps过滤器让Action强制使用HTTPS协议。他将用户浏览器重定向到同一个动作,但使用‘https://'协议前缀
在形成不安全请求时,重写HandledNonHttpsRequest(),以创建自定义行为,该过滤器仅用于GET请求,POST则会丢掉数据;该过滤器时授权过滤器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
ASP.NET Core根据环境变量支持多个 appsettings.json配置文件
这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
- 这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?
这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25nestjs中异常过滤器Exceptionfilter的具体使用
这篇文章主要介绍了nestjs中异常过滤器Exceptionfilter的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-07- 过滤器Filter是定义于tomcat的servlet-api.jar中的一个接口,接口路径为javax.servlet.Filter。tomcat过滤器采用了典型的过滤器设计模式,过滤器链FilterChain由tomcat维持,链条是可以支持多个过滤器的...2021-06-26
详解ASP.NET Core 中基于工厂的中间件激活的实现方法
这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程
这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 过滤器,本质上就是一个函数。其作用在于用户输入数据后,它能够进行处理,并返回一个数据结果。下面这篇文章主要给大家介绍了Vue.js中过滤器的相关资料,需要的朋友可以参考借鉴,一起来看看吧。...2017-01-26
- 这篇文章主要介绍了Vue封装全局过滤器Filters的步骤,通过封装vue全局过滤器实现filters的统一管理。感兴趣的朋友可以了解下...2020-09-16
ASP.NET单选按钮控件RadioButton常用属性和方法介绍
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22- 这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
- 这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
- 这篇文章主要介绍了vue 将多个过滤器封装到一个文件中实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2020-09-05
ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表
在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19- 这篇文章主要介绍了Vue的全局过滤器和私有过滤器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-20
Springmvc ResponseBody响应json数据实现过程
这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26