七、WEB-过滤器
OK,通过上面的代码,你已经学会了基于四种不同的方式来通过 Voovan 框架生成一个Web 服务器.下面我来学习一个小特性—过滤器.
1.过滤器配置入口
路由的入口在 conf/web.json
文件中.下面我们截取一段路由配置:
"Filters": [
{
"Name" : "filter1",
"ClassName" : "org.voovan.test.http.HttpFilterTest",
"Encoding" : "UTF-8",
"Action" : "pass" },
{
"Name" : "filter2",
"ClassName" : "org.voovan.test.http.HttpFilterTest",
"Encoding" : "UTF-8",
"Action" : "pass" },
{
"Name" : "filter3",
"ClassName" : "org.voovan.test.http.HttpFilterTest",
"Encoding" : "UTF-8",
"Action" : "pass" }
]
2.过滤器能做 what?
首先我们来说说过滤器,在 Voovan 的 Web 服务内部设计的有一个过滤器链,当接收到请求的时候,首先由过滤器来进行处理,过滤器链在处理过程中,是按照过滤器的顺序执行的,但当路由处理完时过滤器是按照逆序执行的.每一个过滤器都会接收上一个过滤器处理的结果,这样就实现了过滤的效果.那么我们可以用过滤器做什么呢?
- 对请求和响应的 HTTP 报文进行预(侯)处理,提供了一个基于 HTTP 协议的切面功能.
- 可以进行权限控制,通过
request.redirect(XXX)
方法,可以将不符合业务要求的请求重定向到其他页面.如果在过滤器的onRequest
方法中修改了response参数的 body ( 即:response.body().size()>0
),也可通过调用request.redirect
方法来重定向到其他路由路径,则不会执行路由处理,整个过滤器执行完成后,返回response
.用于对权限控制的处理. - 可以用来做性能分析(性能模块就是基于过滤器完成),可以分析请求时间,不同请求的状态等等.
在规划过滤器的时候建议按照如下步骤进行:
- 过滤器过滤哪些路由?
- 过滤器的过滤点[请求/响应].
- 过滤器的过滤业务规则,并编写代码.
- 在
web.json
(或模块中) 中注册过滤器.
3.方法介绍
//请求过滤函数
public Object onRequest(FilterConfig filterConfig, HttpRequest request, HttpResponse response, Object prevFilterResult );
//响应过滤函数
public Object onResponse(FilterConfig filterConfig, HttpRequest request, HttpResponse response, Object prevFilterResult);
- 业务请求会调用用户实现的这个类
filterConfig
: 过滤器配置类,对应的类org.voovan.http.server.WebConfig.FilterConfig
。request
: HTTPServer 请求对象,对应的类org.voovan.http.server.HttpRequest
。response
: HTTPServer 响应对象,对应的类org.voovan.http.server.HttpResponse
。prevFilterResult
: 上一个过滤器的结果,可用来传递状态参数,用于控制过滤器。.第一个过滤器接收的值是 null。返回值
: 本地过滤器的结果,用于传递到下一个过滤器的prevFilterResult参数。
filterConfig对象中可以获取过滤器名称,过滤器类定义,过滤器参数,具体使用请参看类定义。