过滤器

Jul 10, 2017 10:38:44 AM

作者:zozoh

什么是过滤器?

请你再一次回顾这张图:

过滤器 - 图1

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

如何使用过滤器?

通过 @Filters 注解。

注解 '@Filters' 的值是一个 '@By' 注解的数组,它可以声明在这三个地方

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

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

  1. @Filters({@By(type=Filter1.class), @By(type=Filter2.class)})
  2. public final class MainModule{
  3. ...

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

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

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

使用内置过滤器

  1. @Filters(@By(type=CheckSession.class, args={"user", "/login.jsp"}))

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

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

定制你自己的过滤器

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

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

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

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

交给 Ioc 容器管理

如果你的 Filter 需要比较灵活的配置,你可以将它交由 Ioc 容器负责

  1. @Filters(@By(type=MyFilter.class, args={"ioc:myFilter"}))

其中 "myFilter" 就是你这个过滤器在 Ioc 容器中的名字。关于 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. }
  11. }

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

  1. DEBUG - match? maybe.
  2. DEBUG - before doNext
  3. INFO - 你好
  4. DEBUG - after doNext
  5.  

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

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/mvc/action_filter.html