惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Webroot Blog
Webroot Blog
U
Unit 42
A
About on SuperTechFans
宝玉的分享
宝玉的分享
月光博客
月光博客
C
CERT Recently Published Vulnerability Notes
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Securelist
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
B
Blog
I
Intezer
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
V
V2EX
L
LangChain Blog
AI
AI
G
GRAHAM CLULEY
T
Tor Project blog
人人都是产品经理
人人都是产品经理
D
Docker
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
I
InfoQ
Y
Y Combinator Blog
C
Comments on: Blog
GbyAI
GbyAI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
H
Help Net Security
Vercel News
Vercel News
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿

博客园 - 旋风

ASP.NET MVC3 Razor视图引擎-基础语法 二 ASP.NET MVC3 Razor视图引擎-基础语法 asp.net中 %= 与%# 的区别 ASP.NET MVC3 Model验证总结 ViewData与ViewBag比较 (十九): MVC 3.0 实例之使用开源控件实现表格排序和分页 (十八): MVC 3.0 实例系列之表格中合并排序、分页和筛选 (十七): MVC 3.0 实例之表格中数据的筛选 (十六): MVC 3.0 实例系列之表格数据的分页 (十五): MVC 3.0 实例系列之表格的排序 (十四): MVC 3.0 实例系列之创建数据表格 (十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 (十二): MVC 3.0 使用自定义的Html控件 (十): MVC 3.0 使用 Forms身份验证 (九): MVC 3.0 验证你的Model (八): MVC 3.0 传递和保存你的Model 七): MVC 3.0 新的Razor引擎 (六): MVC 3.0创建你的View视图 (五): 入手Controller/Action
(十一): MVC 3.0 使用筛选器
旋风 · 2012-12-07 · via 博客园 - 旋风

概述

在 ASP.NET MVC 中,控制器将定义一些操作方法,这些操作方法与可能的用户交互(如单击链接或提交窗体)之间通常具有一一对应关系。 例如,当用户单击链接时,会将请求路由到指定的控制器,然后调用对应的操作方法。 例如操作完成后你要产生日志、语言筛选、等其他动态操作。

筛选器的由来及用途

有时,您需要在调用操作方法之前或运行操作方法之后执行逻辑。

为了对此提供支持,ASP.NET MVC 提供了筛选器。 筛选器是自定义类,可提供用于向控制器操作方法添加操作前行为和操作后行为的声明性和编程性手段。

操作筛选器的可能用途与能够应用它们的操作一样种类繁多。 操作筛选器的某些可能用途包括:

  • 日志记录,目的是跟踪用户交互。

  • “反图像攫取”,用于防止在自己网站之外的网页中加载图像。

  • 爬网程序筛选,用于根据浏览器用户代理来更改应用程序行为。

  • 本地化,用于设定区域设置。

  • 动态操作,用于将操作注入到控制器中。

ASP.NET MVC 筛选器的类型

ASP.NET MVC 支持以下类型的操作筛选器:

  • 授权筛选器。 这些筛选器用于实现 IAuthorizationFilter 和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策。 AuthorizeAttribute 类和 RequireHttpsAttribute 类是授权筛选器的示例。 授权筛选器在任何其他筛选器之前运行。

  • 操作筛选器。 这些筛选器用于实现 IActionFilter 以及包装操作方法执行。 IActionFilter 接口声明两个方法:OnActionExecutingOnActionExecuted OnActionExecuting 在操作方法之前运行。 OnActionExecuted 在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。

  • 结果筛选器。 这些筛选器用于实现 IResultFilter 以及包装 ActionResult 对象的执行。 IResultFilter 声明两个方法:OnResultExecutingOnResultExecuted OnResultExecuting 在执行 ActionResult 对象之前运行。 OnResultExecuted 在结果之后运行,可以对结果执行其他处理,如修改 HTTP 响应。 OutputCacheAttribute 类是结果筛选器的一个示例。

  • 异常筛选器。 这些筛选器用于实现 IExceptionFilter,并在 ASP.NET MVC 管道执行期间引发了未处理的异常时执行。 异常筛选器可用于执行诸如日志记录或显示错误页之类的任务。 HandleErrorAttribute 类是异常筛选器的一个示例。

ASP.NET MVC提供的筛选器

ASP.NET MVC 包括以下筛选器,这些筛选器将作为特性实现。 筛选器可在操作方法、控制器或应用程序级别上应用。

  • AuthorizeAttribute. 通过身份验证和授权(可选)限制访问。 如:[Authorize]

  • HandleErrorAttribute. 指定如何处理由操作方法引发的异常。 默认状态此筛选器不会捕获异常,除非在 Web.config 文件中启用了 customErrors 元素。

  • OutputCacheAttribute. 提供输出缓存。

  • RequireHttpsAttribute. 强制不安全的 HTTP 请求通过 HTTPS 重新发送。

筛选器运行顺序

筛选器按下列顺序运行:

  1. 授权筛选器

  2. 操作筛选器

  3. 响应筛选器

  4. 异常筛选器

例如,授权筛选器最先运行,异常筛选器最后运行。 在每个筛选器类型中,Order 值将指定运行顺序。 在每个筛选器类型和顺序中,Scope 模拟值将指定筛选器的顺序。 此枚举将定义以下筛选器范围值(按它们运行的顺序):

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

例如,其 Order 属性设置为 0 且筛选器范围设置为 First 的操作筛选器将在其 Order 属性设置为 0 且筛选器范围设置为 Action 的操作筛选器之前运行。

未定义具有相同类型、顺序和范围的筛选器的执行顺序。

取消筛选器的执行

我们可以将 Result 属性设置为非 null 值,程序运行在 OnActionExecutingOnResultExecuting 方法中会取消筛选器执行。 任何挂起的 OnActionExecutedOnActionExecuting 筛选器都不会调用,且调用程序不会为取消的筛选器和挂起的筛选器调用 OnActionExecuted 方法。 上次运行的筛选器的 OnActionExecuted 筛选器将会运行。 所有 OnResultExecutingOnResultExecuted 筛选器都会运行。

实例:创建自定义操作筛选器 

回顾一下ASP.NET MVC 操作筛选器的执行顺序,框架将先调用操作筛选器的 OnActionExecuting 方法,然后再调用以操作筛选器特性标记的任意操作方法。 同样,该框架将在操作方法完成后调用 OnActionExecuted 方法。

调用 OnResultExecuting 方法后,要立即调用您的操作返回的 ActionResult 实例。 执行结果后,紧接着就要调用 OnResultExecuted 方法。 这些方法对于执行日志记录、缓存输出结果之类的操作非常有用。

创建一个名为LoggingFilterAttribute的类

跟上面所说一样该类继承了ActionFilterAttribute表示操作特性的基类。

代码

复制代码

publicclass LoggingFilterAttribute : ActionFilterAttribute
{
publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess1"] ="正要加载"+ filterContext.ActionDescriptor.ActionName +"方法";base.OnActionExecuting(filterContext);
}
publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess2"] = filterContext.ActionDescriptor.ActionName +"方法加载完毕";base.OnActionExecuted(filterContext);
}
}

复制代码

此处我们只是设置了两个值,放在页面上做对照,完全可以换成日志功能。

调用操作筛选器 

在Controller中新建Index方法在上面加上刚刚定义的筛选标志[LoggingFilter]

复制代码

//
// GET: /Person/
[LoggingFilter]
public ActionResult Index()
{
ViewData[
"mess1"] ="mess1";
ViewData[
"mess2"] ="mess2";
return View(GetData());
}

复制代码

View代码

<h2>@ViewData["mess1"]</h2>
<h2>@ViewData["mess2"]</h2>

运行效果

这一结果完全验证了,筛选器的工作顺序。OnActionExecuting-->Action-->OnActionExecuted

如果有多个筛选的话我们可以用Order来将他们一一列出顺序。默认Order为-1.

复制代码

//
// GET: /Person/
[LoggingFilter(Order =1)]
[LoggingFilter1(Order
=0)]
public ActionResult Index()
{
ViewData[
"mess1"] ="mess1";
ViewData[
"mess2"] ="mess2";
return View(GetData());
}

复制代码

这样就会先执行LoggingFilter1后执行LoggingFilter。

对指定的控制器采用不同的筛选

在ASP.NET MVC Controller 类中我们可以重写的 OnActionExecutingOnActionExecuted 方法。

这样重写这些方法中的一个或全部时,我们的逻辑将在该控制器的所有操作方法之前或之后执行。 此功能类似于操作筛选器,但方法局限于控制器范围。

此时我们就不需要单独去在Action上面去调用他了,因为该Controller 中的筛选已经被重写。并且仅属于该Controller

代码

复制代码

        [NonAction]
protectedoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess1"] ="正要加载"+ filterContext.ActionDescriptor.ActionName +"方法";
base.OnActionExecuting(filterContext);
}

[NonAction]

protectedoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess2"] = filterContext.ActionDescriptor.ActionName +"方法加载完毕";
base.OnActionExecuted(filterContext);
}

复制代码

运行效果与上面的一样

总结

有了筛选器我们的程序变的完美了,权限、操作、响应、异常这一系列的问题都完全被我们自己掌控,成为我们自己的规则,程序可控性更高。