不同的过滤器类型会在执行管道的不同阶段运行,因此他们各自有一套自己的应用场景。可以根据不同的业务需求和在请求管道中的执行位置来选择合适创建的过滤器。运行与MVC Action调用管道内的过滤器有时候被称为过滤管道,当MVC选择要执行哪一个Action的时候,就会调用当前Action上的过滤器。

过滤器作用域

过滤器有三个作用域
1、Action过滤器,可以在Action上增加过滤器,那么过滤器将会针对当前的Action有效;
2、Controllers过滤器,可以在Controllers控制器上增加过滤器,那么过滤器将会针对当前控制器下的所有Action有效
3、全局过滤器,在你配置 MVC 的时候在 Startup 的 ConfigureServices 如下方法,将会在全局生效

过滤器可以通过类型添加,也可以通过实例添加。如果通过实例添加,改实例将会被用于每一个请求。如果通过类型添加,则将会 type-activated(意思是说每次请求都会创建一个实例,其所有构造函数依赖项都将通过 DI 来填充)

 ////配置全局过滤器
services.AddMvc(options =>
{
//ResourceFilter为过滤器名 //通过类型添加
options.Filters.Add(typeof(ResourceFilter));
//通过实例添加
options.Filters.Add(new ResourceFilter());
});

对于.netCore来说过滤器大概分为以下5种

1、授权过滤器:用于确定当前用户是否合法,常用作用户登录及其权限处理。Authorize

  在具体的控制器方法上面增加特性Authorize,然后需要在Startup.cs文件中的ConfigureServices方法中启动授权过滤器(因为默认是不启动的),

   public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); //启动授权过滤器,并且设置存储数据为cookie,如果cookie失效则跳转到登录页面
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).
AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
{
//如果cookie失效则跳转到登录页面
o.LoginPath = new PathString("/Home/Login");
}); }

在登录时,需要将用户信息存储在授权cookie中去

  public IActionResult DoLogin()
{
/*
* 登录以后获取token,
* 获取传递的token,去用户信息
*
*/
string token = "";
string name = "张三";
ClaimsIdentity identity = new ClaimsIdentity("Forms"); identity.AddClaim(new Claim(ClaimTypes.Sid, token));
identity.AddClaim(new Claim(ClaimTypes.Name, name));
//将用户信息存储在授权cookie中
ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(identity);
HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,claimsPrincipal); return Content("登录成功");
}

在需要进行授权验证的控制器或者Action方法上面增加授权特性,当用户没有cookie授权时,就会跳转到登录页面

//登录授权验证
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
public IActionResult Index()
{ //业务逻辑
UserModel user = new UserModel() { Name = "张三" };
ViewBag.Sex = "男";
return View(user);
}

2、资源过滤器:是授权之后第一个用来处理请求的过滤器,也是最后一个接触到请求的过滤器(因为之后就会离开过滤器管道)。在性能方面,自愿过滤器在实现缓存或者短路过滤器管道尤其有用。继承:IResourceFitter或者异步IAsyncResourceFilter

使用时将当前过滤器以特性的方式增加在控制器或者Action方法上:   [ResourceFilter]

 public class ResourceFilter : Attribute, IResourceFilter
{ /// <summary>
/// 管道调用后执行
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{ }
/// <summary>
/// 管道调用前执行
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
// context.Result = new ContentResult() { Content="结束执行"};
}
}

异步资源过滤器

public class ResourceFilter : Attribute, IAsyncResourceFilter
{ /// <summary>
/// 在Action执行前后调用
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns> public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
await next();
}
}

3、Action过滤器:包装了对单个action方法的调用,可以将参数传递给action并从中获得actionresult。继承:IActionFitter或者异步IAsyncActionFilter

使用时将当前过滤器以特性的方式增加在控制器或者Action方法上:   [ActionFilter]

 public class ActionFilter : Attribute, IActionFilter
{
/// <summary>
/// 管道调用后执行
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{ }
/// <summary>
/// 管道调用前执行
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{ context.Result = new ContentResult() { Content="方法执行没有权限" };
}
}

异步Action过滤器

 public class ActionFilter : Attribute, IAsyncActionFilter
{
/// <summary>
/// 管道调用后执行
/// </summary>
/// <param name="context"></param> public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
await next();
}
}

4、异常过滤器:为MVC应用程序未处理异常应用策略。继承:ExceptionFitterAttribute或者异步IAsyncExceptionFilter

使用时将当前过滤器以特性的方式增加在控制器或者Action方法上:    [ExceptionFilter]

  public class ExceptionFilter: ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
// context.Result = new ContentResult() { Content = "系统发生错误" };
}
}

异步异常过滤器

 public class ExceptionFilter: Attribute, IAsyncExceptionFilter
{ public async Task OnExceptionAsync(ExceptionContext context)
{ await next();
} private Task next()
{
throw new NotImplementedException();
}
}

5、结果过滤器:包装了单个actionresult的执行,当且仅当action方法成功执行完毕后才能运行。他们是理想的围绕视图执行或格式处理的逻辑(所在之处)。继承:IResultFilter或者异步IAsyncResultFilter

结果过滤器适用于任何需要直接环绕 View 或格式化处理的逻辑

 public class ResultFiter : IResultFilter
{
public void OnResultExecuted(ResultExecutedContext context)
{ } public void OnResultExecuting(ResultExecutingContext context)
{ }
}

异步执行如下

public class ResultFiter : IAsyncResultFilter
{
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
await next();
} }

不同的过滤器在管道的位置也不同,像授权过滤器执行的就比较靠前,具体顺序如下所示:

.netCore2.0 过滤器的更多相关文章

  1. netcore2.0 ORM框架中如何配置自定义的主外键加载

    环境:netcore2.0 DB :mysql ORM:Ant https://github.com/yuzd/AntData.ORM/tree/netcore2 [给我一个star吧] NUGET: ...

  2. NetCore2.0技术文章目录

    记录NetCore2.0的学习和工作,理解对与错不重要,重要的是,我飘~~~过 ------------------------------------------------------------ ...

  3. 01、NetCore2.0优化之Web服务器 与 IIS解耦

    01.NetCore2.0优化之Web服务器 与 IIS解耦 在Asp.Net Core 2.0中,是如何实现跨平台的?不使用IIS了,在linux上的WebServer是什么? ---------- ...

  4. 02、NetCore2.0优化之Nuget包

    02.NetCore2.0优化之Nuget包 在NetCore2.0中的包是如何管理的?如何存储的?微软做了哪些优化工作? -------------------------------------- ...

  5. 03、NetCore2.0下Web应用之搭建最小框架

    03.NetCore2.0下Web应用之搭建最小框架 这里我们不使用VS2017或者CLI命令的方式创建Asp.Net Core 2.0网页应用程序,而是完全手工的一点点搭建一个Web框架,以便更好的 ...

  6. 04、NetCore2.0下Web应用之Startup源码解析

    04.NetCore2.0Web应用之Startup源码解析   通过分析Asp.Net Core 2.0的Startup部分源码,来理解插件框架的运行机制,以及掌握Startup注册的最优姿势. - ...

  7. 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理

    05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...

  8. 06、NetCore2.0依赖注入(DI)之整合Autofac

    06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...

  9. 07、NetCore2.0依赖注入(DI)之生命周期

    07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...

随机推荐

  1. SSH密钥登陆

    参考: SSH公钥登录原理 比如git可以生成公钥,然后用有权限的账户把他加到仓库上,以后就可以通过公钥登陆了.不需要像https那样需要有账号,但是权限管理就不细了. 有时候如果仓库上添加了多个公钥 ...

  2. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  3. 为什么 SQLite 用 C 编写?

    简评:SQLite 官方出品. C是最好的选择 从 2000 年 5 月 29 日开始,SQLite 就选择了 C 语言.直到今天,C 也是实现 SQLite 这样软件库的最佳语言. C语言是实现 S ...

  4. Tutorial 01 4,5题

    .任务四: 程序设计思想:利用Math.random()产生一个char类型的字符,再利用for循环是他们相加,最后将他们放在一个消息框中输出.   程序流程图:   源程序:           p ...

  5. Linux 内存监控

    1.按照内存使用方式排序 top 之后使用 shift + m 那么top按照内存使用从大到小进行排列,使用 shift + P 表示按照CPU进行排序. bigfish 1118m 438m 30m ...

  6. (STM32F4) IAP程式碼實現

    IAP學習, 主要想了解實際上程式碼放在不同的Flash位置如何轉跳且執行. 我的應用程序只做了Pin12, Pin13 LED閃爍來分辨我的 App1 跟 App2的程式碼 App1 程式碼 int ...

  7. Maven web项目(简单的表单提交) 搭建(eclipse)

    我们将会搭建一个,基于Maven管理的,具有简单的表单提交功能的web项目,使用DAO--service--WEB三层结构,服务器使用Tomcat 1 项目基本结构的搭建 左上角File---> ...

  8. springboot项目,执行查询方法报错

    org.hibernate.LazyInitializationException: could not initialize proxy [com.myproject.sell.dataobject ...

  9. Navicat 连接腾讯云

    1.dos窗口下进入mysql,进行远程登录授权 (1)进行授权 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '1 ...

  10. 6. Javscript学习笔记——BOM

    6. BOM 6.1 widow对象 全局作用域: window是浏览器的一个实例 window对象同时扮演着ECMAScript中的Global对象的角色,因此所有在全局作用域中声明的变量.函数都会 ...