Jul 10, 2017 10:38:44 AM

作者:zozoh

什么是过滤器?

请你再一次回顾这张图:

一个 HTTP 请求,过滤器是第一组被执行的对象。同适配器不同的是,一个请求中,可以执行多个过滤器。

如何使用过滤器?

通过 注解。

  • 入口函数
  • 子模块
  • 主模块
    其中入口函数的 @Filters 优先级更高,其次是子模块,最后是主模块。

就是说,你在入口模块声明了两个过滤器:

在某一个入口函数上声明了一个空的过滤器数组:

  1. @At
  2. public String myFunction(){
  3. ...

那么,这个入口函数将不会应用任何过滤器。

CheckSession 是 Nutz.Mvc 为你内置的一个唯一的过滤器,它的构造函数需要两个参数:

  • 检查 session 的什么属性?
  • 如果不存在,重定向到哪里?

定制你自己的过滤器

你当然可以定制你自己的过滤器,请注意过滤器接口代码:

  1. public interface ActionFilter {
  2. View match(ActionContext context);

根据 HttpRequest 对象,你的过滤器需要决定返回值是:

  • 一个 View : 这个请求有问题,不要继续执行了,马上用这个 View 来渲染 HTTP 输出流吧
  • null : 恩,这个请求没问题,继续吧。
    如果你的过滤器返回的是 null,Nutz.Mvc 会继续执行下一个过滤器,如果全部的过滤器都返回 null它就会调用适配器,进行后面的操作

交给 Ioc 容器管理

其中 "myFilter" 就是你这个过滤器在 Ioc 容器中的名字。关于 Ioc 容器更多的知识,请参看。

请注意 如果你要让 Ioc 容器管理你的过滤器,你的应用必须已经声明了一个 Ioc 容器。 如何在Mvc 框架中声明 Ioc 容器,请参看同 Ioc 容器一起工作

如果Filter实现了Processor接口

从1.r.55开始,如果一个类同时实现了ActionFilter和Processor,那么事情就变得有趣得多

  1. public class SayHiFilterProcessor extends AbstractProcessor implements ActionFilter {
  2. public View match(ActionContext ac) {
  3. log.debug("match? maybe.")
  4. return null;
  5. }
  6. public void process(ActionContext ac) throws Throwable {
  7. log.debug("before doNext");
  8. doNext(ac);
  9. log.debug("after doNext");
  10. }

假设入口方法仅输出一句日志"你好",那么就能看到这样的日志

可以看到,类似于aop的环绕式输出,关于Processor接口的更多信息,请参考动作链

本页面的文字允许在和GNU自由文档许可证下修改和再使用。