首页 > 其他分享 >Filter

Filter

时间:2024-07-29 20:08:48浏览次数:8  
标签:filter next Filter memCache context public

想在大风天去见你,把我吹进你的怀里。 --zhu
切面编程
1、AOP:Aspect Oriented Programming的缩写,意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP思想的延续。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2、ASP.NET Core中的Filter的五类:Authorization filter、Resource filter、Action filter、Excption filter、Result filter。
3、所有筛选器一般都有同步,异步两个版本。IActionFilter、IAsyncActionFilter接口。

Excption filter实现
1、当系统中出现未处理异常的时候,我们需要统一给客户端返回响应报文:{"code","500","message","异常信息"}。
2、实现IAsyncExceptionFilter接口。注入IHostEnvironment(判断开发环境还是生产环境)。

ObjectResult result = new ObjectResult (new{code=500,message=message});
result.StatusCode=500;
context.Result=result;
context.ExcptionHandled = true;//是否被处理完成,是则其他ExcptionFilter不会再执行

program.cs代码

builder.Services.Configure<MvcOptions>(options =>
{
  options.Filters.Add<MyExceptionFilter>();
});

Action Filter
1、IAsyncActionFilter接口。
2、多个ActionFilter链式执行。(先进后出)

public class MyActionFilter1 : IAsyncActionFilter
{
  public async Task OnActionExcutionAsync(ActionExcutingContext context,
          ActionExcutionDelegate next)
  {
    Console.WriteLine("MyActionFilter 1:开始执行");
    ActionExcutedContext  r = await next();
    if (r.Exception != null)
      Console.WriteLine("MyActionFilter 1:执行失败");
    else
      Console.WriteLine("MyActionFilter 1:执行成功");
  }
}
 builder.Services.Configure<MvcOptions>(options=>
{
  options.Filters.Add<MyActionFilter1>();
  options.Filters.Add<MyActionFilter2>();
});

无论同步还是异步Action方法,都能用IAsyncActionFilter处理,如果添加两个ActionFilter,运行效果:

(先进后出)

限速ActionFilter
1、Action Filter可以在满足条件时终止方法执行。
2、如果我们不调用await next(),就可以终止Action方法执行。
3、为避免客户端恶意频繁发送大量请求,可以实现“一秒内只允许一个IP地址请求一次”。

public class RateLimitFiter : IASyncActionFilter
{
  private readonly IMemoryCache memCache;
  public RateLimitFilter(IMemoryCache memCache);
  {
    this.memCache = memCache;
  }
  public async Task OnActionExcutionAsync(ActionExcutingContext context,
          ActionExcutionDelegate next)
  {
    string removeIP= context.HttpContext.Connection.RemoteIpAddress.ToString();
    string cacheKey = $"LastVisitTick_{removeIP}";
    long? lastTick= memCache.Get<long?>(cacheKey);
    if(lastTick == null || Environment.TickCount64 - lastTick > 1000)
    {
      memCache.Set(cacheKey,Environment.TickCount64,TimeSpan.FromSeconds(10));
      return next();
    }
    else
    {
      context.Result = new ContentResult {StatusCode = 429};
      return Task.CompletedTask;
    }
  }
}

标签:filter,next,Filter,memCache,context,public
From: https://www.cnblogs.com/zhusichen/p/18329300

相关文章

  • SciTech-BigDataAIML-Python Time Series Handbook - Kalman filter: 卡尔曼滤波器算
    网上文档:Python时间序列手册:有ipynb和PDF文件:https://filippomb.github.io/python-time-series-handbook/notebooks/07/kalman-filter.htmlMITPDF:AnIntroductiontotheKalmanFilter-MITIllinoisUniversityPDF:UnderstandingtheBasisoftheKalmanF......
  • forms.ModelMultipleChoiceField 与 widget=FilteredSelectMultiple 不适用于自定义新
    我试图在自定义的新管理表单页面上显示forms.ModelMultipleChoiceField但它似乎没有像在已经制作的Django页面上显示的方式显示,例如模型产品Django管理页面。我的forms.ModelMultipleChoiceField看起来像这样:显示我的forms.ModelMultipleChoiceField是什么样子......
  • 具有 ParameterFilter 选项和 Contains 的 AWS ssm describe_parameters 返回结果,但具
    我在从aws参数存储获取数据时遇到一个奇怪的问题。我正在调用描述参数来获取有关参数的信息。下面是相同的Python代码。参数存储:my-data.api_dataimportboto3ssm_client=boto3.client('ssm')response=ssm_client.describe_parameters(ParameterFilters=[......
  • Django 你不知道的filterset_fields和filter_fields区别
    filter_fields和filterset_fields是DjangoRESTframework(DRF)中用于过滤的两个不同概念:filter_fields定义:在DRF的ModelViewSet中,filter_fields允许你指定可用于过滤的字段。用法:你可以在视图中设置这个属性,来指定哪些字段可以用于过滤。例如,如果你有一个模型......
  • js-数组内置函数-filter、map、forEach、reduce
    1、过滤数组-filter筛选数组元素,并生成新数组//过滤出分数为60分以上的数据<script>constarr=[{'name':'张三','score':80},{'name':'张六','score':50},{'name':'李四','scor......
  • 【YashanDB知识库】filter or改写问题
    问题现象当filter中出现or的时候,会导致filter无法走索引或者走hashjoin,就需要进行改写,例如:createtabletest_tab1(col1int,col2int,col3int);createtabletest_tab2(col4int,col5int,col6int);beginforiin1..10000loopinsertintotest_tab1values(i......
  • ASP.NET Core MVC如何在Filter中获取ControllerName和ActionName,以及在Action方法上声
    在ASP.NETCoreMVC的Filter中,我们可以通过ActionContext对象获取到许多有用的信息,例如下面的代码在IAuthorizationFilter中,获取了ControllerName和ActionName,以及在Action方法上声明的Filter:usingMicrosoft.AspNetCore.Mvc.Controllers;usingMicrosoft.AspNetCore.Mvc.Filte......
  • gateway filter
    默认filter默认的有38个,分为5组:请求头、请求参数(查询字符串)、响应头、前缀和路径、其他,作用都不是很大,挑几个举个例#请求和响应filter-id:test_my_consumeruri:http://localhost:8082predicates:-Path=/feign/**filters:-AddRequestHeader=custom......
  • 过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
    https://www.cnblogs.com/kuotian/p/13176186.html过滤器FilterFilter有如下几个用处。Filter有如下几个种类。javax.servlet.Filter接口1.通过@WebFilter注解配置2.通过@Bean来配置3.SpringMVC在web.xml配置过滤器启动测试拦截器InterceptorHandlerIn......
  • search_fields 和 FilterSet
     第一种方法search_fields=['code','name','short_name','org_type','trade_status','address','search']#search字段模糊搜索 第二种方法fromdjango_filters.rest_frameworkimportFi......