不同的过滤器类型会在执行管道的不同阶段运行,因此他们各自有一套自己的应用场景。可以根据不同的业务需求和在请求管道中的执行位置来选择合适创建的过滤器。运行与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. 只是误以为导入了maven依赖

    背景: 之前用Spring Boot 开发了一个小项目,考虑将代码迁到Git服务器,由于之前没用过Git,在将代码正式签入Git服务器前, 我想先签入一个最简单的Spring Boot程序代码作为试验 ...

  2. commons工具类

    转自:https://blog.csdn.net/leaderway/article/details/52387925 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不 ...

  3. 「HNOI 2014」米特运输

    题目链接 戳我 \(Describe\) 谁出的题目啊?这么长的题面,看完就滚粗了.强烈谴责 给一棵树,每个点有一个权值,要求修改一些权值,使: 一个点的权值必须是其所有儿子的权值之和 一个点的儿子权 ...

  4. 爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/ ...

  5. IO模型《三》非阻塞IO

    非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...

  6. 2016级算法第五次上机-A.Beihang Collegiate Pronunciation Contest 2017

    1065 Beihang Collegiate Pronunciation Contest 2017 思路 在字符串中不断做匹配 找到一个匹配就输出 时间复杂度\(O(n)\) ps.模式串是定长的, ...

  7. 233 Matrix(矩阵快速幂+思维)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  8. 线性代数与simplex

    线性方程组: \(i:1-n\) \(j:1-m\) \({\begin{cases}a_{11}x_1+a_{12}x_2+a_{13}x_3+\cdots+a_{1n}x_n=b_1\\a_{21 ...

  9. Git sparse-checkout 检出指定目录或文件

    根据网上资料整理而来,git 1.7版本后支持的sparse checkout特性,可以指定需要checkout的目录或者文件. # 设置允许git克隆子目录 git config core.spar ...

  10. redis的主从同步

    一.redis的主从操作流程 1. 准备三个redis配置文件 #进入redis的配置文件夹,准备好这几个文件,6379不用管,默认的,和这次操作无关 [root@qishi ~]# cd /etc/ ...