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

    var data = [{ "name": "1", "value": 54 }, { "name": "2& ...

  2. layui后台框架的搭建

    layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从 ...

  3. 第一个.NET Core应用,创建.NET Core命令

    打开cmd,依次输入mkdir .project(创建目录),cd .\.project(进入目录),dotnet new(新建初始项目),dotnet restore(还原依赖),dotnet ru ...

  4. Django Query

    Making Qeries 一旦创建了数据模型,Django就会自动为您提供一个数据库抽象API,允许您创建.检索.更新和删除对象.本文档解释了如何使用这个API. The models 一个clas ...

  5. 8 个用于生产环境的 SQL 查询优化调整

    在没有数据仓库或单独的分析数据库的组织中,报告的唯一来源和最新的数据可能是在现场生产数据库中. 在查询生产数据库时,优化是关键.一个低效的查询可能会对生产数据库产生大量的资源消耗,如果查询有错误会引发 ...

  6. linux 修改主机名 【root@主机名 ~】

    centos 7修改方式: hostnamectl  set-hostname   hostuser reboot 或者直接vi /etc/hostname 添加内容: hostuser 检查修改效果 ...

  7. 9w5:第九周程序填空题1

    描述 下面的程序输出结果是: 1 2 6 7 8 9 请填空: #include <iostream> #include <iterator> #include <set ...

  8. “全栈2019”Java第十三章:基本数据类型

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第十七章:赋值运算符和算术运算符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. 模糊查询中Like的使用

    通配符: %. _ %:表示任意个或多个字符.可匹配任意类型和长度的字符 _:表示任意单个字符.匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符) demo: //usern ...