一、简介

使用过 ASP.NET 的同学都知道,Filter 是一个非常中的概念,是项目开发过程中也是经常使用的。今天我们就来讲讲,通过Filter给 Request、Response 加点料。通过 Filter 处理 Request、Response 的应用场景有许多:对 token 业务上的验证、可以封装框架对 request 的基本验证等等。

二、案例

接下来,通过简单的案例阐述今天要说的知识点,案例写的相对简单明白去原理即可,具体在工作中的使用,需要自己去结合实际业务

2.1 BaseClass

首先定义 BaseRequest、BaseResponse 两个基类,这个会被 API 的 Request、Respons 继承,其次也会在 Filter 中做类型判断被使用。其实继不继承都可以,直接使用 API Request、Respons 也可以,这样会不利于代码维护,通常都是在共性基类中做。

public class BaseRequest
{public string Token { get; set; }
}

public class BaseResponse
{public string Msg { get; set; }
}

2.2 Request Respons

定义 AddProduc 的 Request、Respons,并分别继承 BaseRequest、BaseResponse

public class AddProducRequest : BaseRequest
{}

public class AddProductRespons : BaseResponse
{public string Token { get; set; }
}

2.3 Controller

定义一个 Post 方式的 API 入参、出参分别是 AddProducRequest 、AddProductRespons。这样为了演示功能原理,所以将 token 进行传递。

[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{private readonly ILogger<HomeController> _logger;public HomeController(ILogger<HomeController> logger){_logger = logger;}[HttpPost][Route("AddProduc")]public AddProductRespons AddProduc([FromBody] AddProducRequest request){return new AddProductRespons() { Token = request?.Token };}
}

2.4 RequestResponseHandleFilter

定义一个 继承于 ActionFilterAttribute 的 RequestResponseHandleFilter ,在 OnActionExecutionAsync 方法处理 action 的 request ,在 OnResultExecutionAsync 处理 action 的 respons

public class RequestResponseHandleFilter : ActionFilterAttribute
{public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){var baseRequest = context.ActionArguments?.FirstOrDefault().Value as BaseRequest;if (baseRequest != null){baseRequest.Token = Guid.NewGuid().ToString();}await next();}public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next){if (context.Result is ObjectResult objResult && objResult?.Value is BaseResponse baseResponse){baseResponse.Msg = "我在 filter 中被赋值";}await base.OnResultExecutionAsync(context, next);}
}

2.5 注册 Filter

builder.Services.AddMvc(opt =>
{opt.Filters.Add(new RequestResponseHandleFilter());
});

2.6 启动演示

可以看到,在 RequestResponseHandleFilter 中对 request token 的赋值处理是成功的,对 respons 中 msg 赋值处理也是成功的

三、源码

https://download.csdn.net/download/weixin_46785144/85043694

通过Filter给Request、Response加点料相关推荐

  1. Filter若不写chain.doFilter(request,response)原Servlet路径代码不会被执行

    为什么80%的码农都做不了架构师?>>>    Filter如果不写chain.dofilter(request,response) 那么对应的Servlet URL 是不会执行的. ...

  2. 浅谈filter中的chain.doFilter(request, response)的作用

    filter在web开发中可谓是神通广大,想必大家都有所了解,在这里不作赘述. 下面主要谈一谈chain.doFilter(request, response);这条语句是怎么回事,过滤器的作用就是之 ...

  3. 过滤器filter中的chain.doFilter(request, response)的作用

    请求到达servlet之前,拦截下来做预处理,处理之后便执行chain.doFilter(request, response)这个方法.chain.doFilter将请求转发给过滤器链下一个filte ...

  4. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

  5. filter的request增强

    BufferedReader的增强 package cn.lcp.damo;import java.io.BufferedReader; import java.io.IOException; imp ...

  6. chain.doFilter(request,response)详解

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用. 过滤 过滤器的大多 ...

  7. 网页出现重复(双份)的可能原因之一:chain.doFilter(request, response);重复调用;

    这是原来的网页. 因为先要加个过滤器从而控制用户对于网站服务器的访问,以保证服务器的安全,即用户只能访问指定的网页 下面是MyFilter类的具体代码: public class MyFilter i ...

  8. 3.request response

    rr的介绍 request是代表请求,response是响应 执行流程: 1.浏览器发送请求 2.服务器接受请求,创建两个对象,将请求信息封装给request,将两个对象发送给对应的servlet 3 ...

  9. 【错误记录】Android Studio 配置 GitHub 报错 ( Can‘t login using given credentials: Request response: 401 Una )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用账号密码配置 , 出现如下错误 ; Can't login using given credentials: Request response: ...

最新文章

  1. python定时任务contrib_django+celery配置(定时任务+循环任务)
  2. Java Web的Maven项目中Properties文件的使用
  3. Windows 7键盘失灵导致无法输入登录密码问题解决方案
  4. Python性能测试
  5. php字符串类型讲解
  6. C#系统开发登录窗体在MDI窗体之前显示
  7. leetcode596. 超过5名学生的课(SQL)
  8. linux查看mongodb的ip地址,[转载]在MongoDB的shell中显示服务器当前IP
  9. 频率和波特率_实例详解 | 变频器端子启停与通信设定频率(附程序)
  10. 控制項學習四(屬性與事件)
  11. VS2008 Qt Designer 中自定义信号槽
  12. 高性能web建站规则(将js放在页面底部)
  13. selenium webdriver - 截图
  14. unity Mesh Renderer的一点想法
  15. [经典好文] 谈笑色影间,人生本无忌 (转于色影无忌)
  16. 美团搜索多业务商品排序探索与实践
  17. 智能设计课程v2.0 | DesignX 2021版
  18. Allegro PCB操作技巧
  19. acp 适应性领导_什么是适应性领导?
  20. MySQL异常java.sql.SQLSyntaxErrorException

热门文章

  1. 倍福TwinCAT(贝福Beckhoff)应用教程11.1 TwinCAT应用小程序1 如何读写数字量模拟量输入输出(DI,DO,AI,AO)
  2. os是android5.0,拥抱Android 5.0,技德科技发布Remix OS 1.5
  3. 如何在自己的Android APP中加入广告
  4. 广西大学计算机系上机题库代码一览20级
  5. 基于PHP+MySQL的共享单车租赁系统 thinkphp+vue
  6. 实时消息RTM| 多活架构中的数据一致性问题
  7. 亚马逊选品_2022年亚马逊最全的选品方法和策略
  8. 经典的饮食搭配 营养又健康
  9. MTK/RK/AW 动态屏参参数文件
  10. 2017二级java考试时间_2017年全国计算机二级考试科目