七、WEB-过滤器

OK,通过上面的代码,你已经学会了基于四种不同的方式来通过 Voovan 框架生成一个Web 服务器.下面我来学习一个小特性—过滤器.


1.过滤器配置入口

路由的入口在 conf/web.json 文件中.下面我们截取一段路由配置:

  1. "Filters": [
  2. {
  3. "Name" : "filter1",
  4. "ClassName" : "org.voovan.test.http.HttpFilterTest",
  5. "Encoding" : "UTF-8",
  6. "Action" : "pass" },
  7. {
  8. "Name" : "filter2",
  9. "ClassName" : "org.voovan.test.http.HttpFilterTest",
  10. "Encoding" : "UTF-8",
  11. "Action" : "pass" },
  12. {
  13. "Name" : "filter3",
  14. "ClassName" : "org.voovan.test.http.HttpFilterTest",
  15. "Encoding" : "UTF-8",
  16. "Action" : "pass" }
  17. ]

2.过滤器能做 what?

首先我们来说说过滤器,在 Voovan 的 Web 服务内部设计的有一个过滤器链,当接收到请求的时候,首先由过滤器来进行处理,过滤器链在处理过程中,是按照过滤器的顺序执行的,但当路由处理完时过滤器是按照逆序执行的.每一个过滤器都会接收上一个过滤器处理的结果,这样就实现了过滤的效果.那么我们可以用过滤器做什么呢?

  • 对请求和响应的 HTTP 报文进行预(侯)处理,提供了一个基于 HTTP 协议的切面功能.
  • 可以进行权限控制,通过 request.redirect(XXX) 方法,可以将不符合业务要求的请求重定向到其他页面.如果在过滤器的 onRequest 方法中修改了response参数的 body ( 即:response.body().size()>0 ),也可通过调用request.redirect方法来重定向到其他路由路径,则不会执行路由处理,整个过滤器执行完成后,返回response.用于对权限控制的处理.
  • 可以用来做性能分析(性能模块就是基于过滤器完成),可以分析请求时间,不同请求的状态等等.

在规划过滤器的时候建议按照如下步骤进行:

  • 过滤器过滤哪些路由?
  • 过滤器的过滤点[请求/响应].
  • 过滤器的过滤业务规则,并编写代码.
  • web.json(或模块中) 中注册过滤器.

3.方法介绍

  1. //请求过滤函数
  2. public Object onRequest(FilterConfig filterConfig, HttpRequest request, HttpResponse response, Object prevFilterResult );
  3. //响应过滤函数
  4. 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对象中可以获取过滤器名称,过滤器类定义,过滤器参数,具体使用请参看类定义。