不同的过滤器类型会在执行管道的不同阶段运行,因此他们各自有一套自己的应用场景。可以根据不同的业务需求和在请求管道中的执行位置来选择合适创建的过滤器。运行与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. html 线条重叠变粗

    加入属性 单元格重叠变粗 使用border-collapse:collapse;  可以解决.

  2. [C#]合并单元格(行、列)

    详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak説明:控件ID指的是页面上面的Grid ...

  3. maven-compiler-plugin 版本错误解决方法

    项目执行Maven build后出现WARNING提示.报如信息如下,根据报错信息猜测是maven-compiler-plugin的版本信息问题 [WARNING] [WARNING] Some pr ...

  4. HttpRunnerManager接口自动化测试框架在win环境下搭建教程

    近几日一直在研究如何把接口自动化做的顺畅,目前用的是轻量级jmeter+ant+Jenkins自动化测试框架,目前测试界的主流是python语言,所以一直想用搭建一个基于python的HttpRunn ...

  5. WordCount(JAVA实现)

    201631103228,201631101227 1.项目需求 对程序设计语言源文件统计字符数.单词数.行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件. wc. ...

  6. 1002. 查找常用字符 leecode

    题目: 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该 ...

  7. ParserError: Error tokenizing data. C error: Expected 2 fields in line 15, saw 4

    pandas 读取泰坦尼克号数据,报错 %matplotlib inline import numpy as np import pandas as pd import re as re train ...

  8. 原生态js展开收缩

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 【maven】---初识

    前言 最近在研究自动化测试,其中的一个研究点儿就是maven,去download了一本书,看了看.下面是自己的从书中摘录的一些关于maven的概念性的东西. 内容 maven是什么? Maven是一个 ...

  10. kali linux之拒绝服务攻击工具

    hping3 几乎可以定制发送任何TCP/IP数据包,用于测试FW,端口扫描,性能测试 -c - 计数包计数  -i - interval wait(uX表示X微秒,例如-i u1000)       ...