通过Filter给Request、Response加点料
一、简介
使用过 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加点料相关推荐
- Filter若不写chain.doFilter(request,response)原Servlet路径代码不会被执行
为什么80%的码农都做不了架构师?>>> Filter如果不写chain.dofilter(request,response) 那么对应的Servlet URL 是不会执行的. ...
- 浅谈filter中的chain.doFilter(request, response)的作用
filter在web开发中可谓是神通广大,想必大家都有所了解,在这里不作赘述. 下面主要谈一谈chain.doFilter(request, response);这条语句是怎么回事,过滤器的作用就是之 ...
- 过滤器filter中的chain.doFilter(request, response)的作用
请求到达servlet之前,拦截下来做预处理,处理之后便执行chain.doFilter(request, response)这个方法.chain.doFilter将请求转发给过滤器链下一个filte ...
- chain.doFilter(request,response)含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...
- filter的request增强
BufferedReader的增强 package cn.lcp.damo;import java.io.BufferedReader; import java.io.IOException; imp ...
- chain.doFilter(request,response)详解
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用. 过滤 过滤器的大多 ...
- 网页出现重复(双份)的可能原因之一:chain.doFilter(request, response);重复调用;
这是原来的网页. 因为先要加个过滤器从而控制用户对于网站服务器的访问,以保证服务器的安全,即用户只能访问指定的网页 下面是MyFilter类的具体代码: public class MyFilter i ...
- 3.request response
rr的介绍 request是代表请求,response是响应 执行流程: 1.浏览器发送请求 2.服务器接受请求,创建两个对象,将请求信息封装给request,将两个对象发送给对应的servlet 3 ...
- 【错误记录】Android Studio 配置 GitHub 报错 ( Can‘t login using given credentials: Request response: 401 Una )
文章目录 一.报错信息 二.解决方案 一.报错信息 使用账号密码配置 , 出现如下错误 ; Can't login using given credentials: Request response: ...
最新文章
- python定时任务contrib_django+celery配置(定时任务+循环任务)
- Java Web的Maven项目中Properties文件的使用
- Windows 7键盘失灵导致无法输入登录密码问题解决方案
- Python性能测试
- php字符串类型讲解
- C#系统开发登录窗体在MDI窗体之前显示
- leetcode596. 超过5名学生的课(SQL)
- linux查看mongodb的ip地址,[转载]在MongoDB的shell中显示服务器当前IP
- 频率和波特率_实例详解 | 变频器端子启停与通信设定频率(附程序)
- 控制項學習四(屬性與事件)
- VS2008 Qt Designer 中自定义信号槽
- 高性能web建站规则(将js放在页面底部)
- selenium webdriver - 截图
- unity Mesh Renderer的一点想法
- [经典好文] 谈笑色影间,人生本无忌 (转于色影无忌)
- 美团搜索多业务商品排序探索与实践
- 智能设计课程v2.0 | DesignX 2021版
- Allegro PCB操作技巧
- acp 适应性领导_什么是适应性领导?
- MySQL异常java.sql.SQLSyntaxErrorException
热门文章
- 倍福TwinCAT(贝福Beckhoff)应用教程11.1 TwinCAT应用小程序1 如何读写数字量模拟量输入输出(DI,DO,AI,AO)
- os是android5.0,拥抱Android 5.0,技德科技发布Remix OS 1.5
- 如何在自己的Android APP中加入广告
- 广西大学计算机系上机题库代码一览20级
- 基于PHP+MySQL的共享单车租赁系统 thinkphp+vue
- 实时消息RTM| 多活架构中的数据一致性问题
- 亚马逊选品_2022年亚马逊最全的选品方法和策略
- 经典的饮食搭配 营养又健康
- MTK/RK/AW 动态屏参参数文件
- 2017二级java考试时间_2017年全国计算机二级考试科目