ASP.NET mvc4中的过滤器的使用
发布时间 - 2026-01-11 00:04:54 点击率:次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
# mvc4
# 过滤器
# .net
# ASP.NET过滤器的应用方法介绍
# Asp.Net MVC学习总结之过滤器详解
# ASP.NET Core MVC 过滤器的使用方法介绍
# ASP.NET Core MVC 过滤器(Filter)
# 聊一聊Asp.net过滤器Filter那一些事
# ASP.NET Core MVC中过滤器工作原理介绍
# ASP.NET MVC过滤器执行顺序介绍
# ASP.NET Core中ResourceFilter过滤器的实现
# 器上
# 自定义
# 内建
# 所需
# 操作方法
# 多个
# 重写
# 未处理
# 则为
# 应用程序
# 自己的
# 的是
# 是一个
# 放在
# 子类
# 不需要
# 才会
# 没有任何
# 但在
# 这是一个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建安全的FTP站点?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel如何使用Blade模板引擎?(完整语法和示例)
如何在建站宝盒中设置产品搜索功能?
JS碰撞运动实现方法详解
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何用已有域名快速搭建网站?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
如何在腾讯云服务器快速搭建个人网站?
如何快速重置建站主机并恢复默认配置?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
如何在宝塔面板创建新站点?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何快速生成高效建站系统源代码?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
制作企业网站建设方案,怎样建设一个公司网站?
如何获取PHP WAP自助建站系统源码?
Laravel如何创建自定义Artisan命令?(代码示例)
如何选择PHP开源工具快速搭建网站?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
千库网官网入口推荐 千库网设计创意平台入口
JavaScript如何实现音频处理_Web Audio API如何工作?
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
*服务器网站为何频现安全漏洞?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何在服务器上配置二级域名建站?
高端云建站费用究竟需要多少预算?
Laravel如何使用Vite进行前端资源打包?(配置示例)
如何用y主机助手快速搭建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
详解阿里云nginx服务器多站点的配置
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Laravel怎么判断请求类型_Laravel Request isMethod用法
如何解决hover在ie6中的兼容性问题
JavaScript如何操作视频_媒体API怎么控制播放
动图在线制作网站有哪些,滑动动图图集怎么做?
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】

