.NetCore——自定义过滤器ActionFilterAttribute
一、介绍
在我们做项目开发的时候很多时候需要自己定义过滤器,来进行一些特殊的处理,最常见的就是验证Token什么的,判断你这一次的请求是否合法。还有很多的用法就看项目的实际情况去自定义策略了。下面我介绍一下我做的自定义策略。
二、实现
首先添加一个MyAuthorizeFilter类库,继承ActionFilterAttribute,重写其中的方法。我重写的OnActionExecuting这个方法。
方法介绍
// 在Action执行之后由 MVC 框架调用。
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
// 在Action执行之前由 MVC 框架调用。
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
// 在执行Result后由 MVC 框架调用。
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
// 在执行Result之前由 MVC 框架调用。
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
现在就在MyAuthorizeFilter类里面添加代码如下
public class MyAuthorizeFilter : ActionFilterAttribute
{
/// <summary>
/// 在方法执行前
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool ischeck = false;
//判断Controller是否跳过验证
if (filterContext.Controller.GetType().GetCustomAttributes(typeof(SkipActionFilterAttribute), false).Any())
{
ischeck = true;
}
else
{
//判断Action是否跳过验证
if (filterContext.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
{
if (controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
.Any(a => a.GetType().Equals(typeof(SkipActionFilterAttribute))))
{
ischeck = true;
}
}
}
if (!ischeck)
{
var token = filterContext.HttpContext.Request.Headers["token"].ToString();
if (string.IsNullOrEmpty(token))
{
}
}
return;
}
}
可以通过代码片段看出是否需要验证,如果需要验证的话,就查找请求头中Token是否存在,如果存在正常执行,如果不存在可以自定义返回内容。
下面就是添加跳过验证的类库SkipActionFilterAttribute如下
public class SkipActionFilterAttribute : ActionFilterAttribute
{
}
添加好这个类库后,然后在Startup中的ConfigureServices方法中注册使用,否则将不会生效。如下
当我们做好这些准备工作后,重新编译,运行调试就可以看到所有的请求会先进到MyAuthorizeFilter的OnActionExecuting方法中
当然在一些特定的情况下我们有些接口/控制器不需要进行验证,这个时候SkipActionFilterAttribute类库就可以派上用场了。在方法/控制器的顶部添加[SkipActionFilterAttribute]标识,这个时候就标识这个方法/控制器跳过验证。
如图所示
这样设置完以后就可以完成基本使用了。