ASP.NET Filers用来在MVC框架的不同请求处理阶段,注入额外的逻辑。过滤器为横切关注点提供了一种方法(日志记录,授权,缓存)。

在这篇文章中,我将会向你介绍MVC框架支持的各种不同种类过滤器,怎样控制过滤器的执行,怎样创建和使用过滤器。我们可以创建自定义的过滤器。在每一个请求中,控制器中的方法会检查,是否用户是正确授权的,如果是正确授权的用户,就会允许用户执行相应的方法,显示相应的视图给用户。

ASP.NET支持四种类型的过滤器。Authentication过滤器是在ASP.NET MVC 5中介绍的。每种过滤器都允许你在请求的不同阶段,注入相应逻辑处理。

Filters Type【过滤器类型】 Interface【接口】  
Authentication【验证过滤器】 IAuthenticationFilter 在所有其他的过滤器或者Action方法之前执行
Authorization【授权过滤器】 IAuthorizationFilter 在允许其他过滤器或者Action方法之前,执行
Action【Action过滤器】 IActionFilter 在Action方法之前或者之后执行
Result【结果过滤器】 IResultFilter 在Action方法的执行结果之前或者之后执行
Exception【异常过滤器】 IExceptionFilter 只有在其他过滤器,Action方法,或者Action的执行结果执行的时候出现异常,才会执行异常过滤器

ASP.NET 中的过滤器类型以及它们的执行顺序

1.Authentication Filters【验证过滤器】

Authentication 过滤器在任何其他过滤器或者Action方法之前执行。Authentication 过滤器确保你是合法还是非法用户。它实现了IAuthenticationFilter接口。

2.Authorization Filters【授权过滤器】

AuthorizeAttribute和RequireHttpsAttribute都是Authorizatio过滤器的例子。授权过滤器用来检查用户是否有访问权限。授权过滤器实现了IAuthorizationFilter接口。

3.Action Filters【Action过滤器】

Action过滤器是一个特性,你可以应用到控制器的方法上,也可以应用到整个控制器上。这个过滤器将会在Action方法开始执行之前或者开始执行之后执行,以及Action执行之后开始调用。

Action过滤器实现了IActionFilter接口,有两个方法OnActionExecuting和OnActionExecuted。OnActionExecuting在Action方法之前执行,并给了一个机会来取消执行Action方法。这些过滤器包含了一些逻辑,在Action方法执行之前或者执行之后调用,你可以使用Action过滤器,来修改控制器中的Action方法返回的视图数据。

4.Result Filters【结果过滤器】

OutputCacheAttribute类就是结果过滤器的一个例子。结果过滤器实现了IResultFilter接口。和IActionFilter类似,也有OnResultExecuting和OnResultExecuted两个方法。这些过滤器包含一些逻辑,在ViewResult开始执行之前或者之后调用。你可以使用结果过滤器,来修改视图的结果,在视图呈现到浏览器之前。

5.Exception Filters【异常过滤器】

HandleErrorAttribute类是ExceptionFilters的一个例子。异常过滤器实现了IExceptionFilter接口,异常过滤器在程序运行的过程中如果发生了未处理的异常就会执行。这些过滤器可以用做异常过滤器,用来处理控制器中的Action方法的错误,或者Action方法返回结果的错误。你可根据需要以重写这些方法。

好了,上面的理论知识介绍的差不多,我们来创建一个项目,练练手,实际操作一下:

1.在ASP.NET MVC 5中创建一个自定义的Authentication过滤器

创建一个MV项目:

在项目中,创建一个文件夹AuthData,添加我们自定义的类AuthAttribute;

IAuthenticationFilter接口定义了两个方法:OnAuthentication和OnAuthenticationChallenge。OnAuthentication先执行,用来处理需要的验证逻辑。OnAuthenticationChallenge用来根据用户验证的结果,进一步做限制处理。在OnAuthentication方法中,我写了一些代码用来对用户作验证,OnAuthenticationChallenge中,我写了一些代码,用来执行其他任务。

现在,让我们来测试一下,我们写的自定义验证过滤器;

运行项目,然后注册:

你还可以管理你的账户信息:

 2.现在看看 Authorization Filter:

Authorization确保只有经过允许的用户才能访问。这些过滤器在Action方法执行之前调用,实现了IAuthorizationFilter接口。包含了一个方法OnAuthorization。

为了验证Authorization,我们对刚才的AuthAttribute类作个修改。我们重写了AuthorizeAttribute类中的AuthorizeCore(HttpContextBase httpContext)方法。

现在打开Home控制器,修改代码:

运行项目:输入刚才注册的账号和密码:可以看到授权通过,登录成功了。

还可以这样:在About方法上标识特性,然后允许项目,点击关于按钮,就会弹出来登录页面,让登录:

还可以限制,只让某个用户看到About页面,可以这样做:这里,我只让649713412@qq.com这个用户访问About页面。

现在我们运行项目,重新注册一个账号123456@qq.com.

可以看到,123456@qq.com这个账号访问不了About页面。又弹出来了登录页面。

 3.再来看看Action Filter,又下面的几个Action Filters:

  1. Output Cache:缓存控制器的Action
  2. Handle Error:当控制器的方法报错的时候,处理错误
  3. Authorize :允许你限制有相应权限的才能访问

Output Cache

下面的例子,指定返回值将会被缓存5秒

再看看Handle Error例子:

为了实现Handle例子,我们改装一下AuthAttribute类:

注意我们需要创建一个静态的错误页面:

然后运行项目,在地址栏输入:

然后就看到了:错误页面》》

输入大于100的试试:

好了 ,以上就是Filters的全部内容,有不明白的,欢迎留言。目前这个0基础系列,暂时先告一段落,我打算写一些高级的内容,后续如果有基础的知识需要讲,就接着这个系列写。谢谢大家支持。

8. Filters in ASP.NET MVC 5.0【ASP.NET MVC 5.0中的过滤器】的更多相关文章

  1. 从 MVC 到使用 ASP.NET Core 6.0 的最小 API

    从 MVC 到使用 ASP.NET Core 6.0 的最小 API https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/ 2007 年,随着 ...

  2. Announcing the Release of ASP.NET MVC 5.1, ASP.NET Web API 2.1 and ASP.NET Web Pages 3.1 for VS2012

    The NuGet packages for ASP.NET MVC 5.1, ASP.NET Web API 2.1 and ASP.NET Web Pages 3.1 are now live o ...

  3. Spring.Net2.0+NHibernate4.0 +Asp.Net Mvc4 二

    6.SN.Controllers 文件夹Config(Controllers.xml) 文件夹Controllers(TestController.cs) Controllers.xml <?x ...

  4. ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...

  5. Asp.Net Core 项目实战之权限管理系统(0) 无中生有

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. ASP.NET MVC 5 01 - ASP.NET概述

    本篇目录: ASP.NET 概述 .NET Framework 与 ASP.NET ASP.NET MVC简介 ASP.NET的特色和优势 典型案例 ▁▃▅ ASP.NET概述 ▅▃▁ 目前开发B/S ...

  7. ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点

    参考书籍:<ASP.NET MVC 4 高级编程>.<ASP.NET MVC 5 高级编程>.<C#高级编程(第8版)>.<使用ASP.NET MVC开发企业 ...

  8. .NET跨平台之旅:将示例站点从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0

    终于将“.NET跨平台之旅”的示例站点 about.cnblogs.com 从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0 ,经历了不少周折,在这篇博文中记录一下. 从 AS ...

  9. [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向

    [.net 面向对象程序设计深入](4)MVC 6 ——谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...

随机推荐

  1. OpenCV代码:画出轮廓的外接矩形,和中心点

    #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include & ...

  2. 如何在js中使用递归

    很久没写博客了... 内容后补

  3. Eclipse 如何查看源代码

    Eclipse 关联源代码:

  4. ADC采样间隔问题+TRGO作为ADC的触发源头

    为了控制采样时间,可以使用一个定时器的TRGO(定时器里每次发生更新事件时会有这个信号产生)作为定时器的外部触发. 从定时器框图可以看出,TRGO为TIMx的一个输出.不过这个输出是内部使用的. vo ...

  5. Codeforces Round #449 (Div. 2)

    Codeforces Round #449 (Div. 2) https://codeforces.com/contest/897 A #include<bits/stdc++.h> us ...

  6. 213. House Robber II 首尾相同的偷窃问题

    [抄题]: You are a professional robber planning to rob houses along a street. Each house has a certain ...

  7. Windows7 VS2015 下编译 Python3.6.6

    本机环境: 1.win7 64 旗舰版 2.Qt 5.11.2(MSVC 2015,32 bit) 3.到目前为止,python官方2018-10-20更新,Python 3.6.7: 1.下载合适的 ...

  8. [字符串][NOIP2012]Vigenère密码

    Vigenère密码 题目描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高, ...

  9. c++沉思录 学习笔记 第五章 代理类

    Vehicle 一个车辆的虚基类 class Vehicle {public: virtual double weight()const = 0; virtual void start() = 0; ...

  10. 【mysql】decimal数据类型

    1.float.double.decimal float:浮点型,4字节,32bit. double:双精度实型,8字节,64位 decimal:数字型,128bit,不存在精度损失,常用于银行帐目计 ...