Restlet multi Filter实现

时间:2015-04-05 06:45:55

标签: java restlet

我有几个Resource个类,其中一些有自己的过滤器LoginResourceForceLogoutResource),有些则没有(LogoutResource

    LoginFilter loginProcess = new LoginFilter();
    loginProcess.setNext(LoginResource.class);

    LogoutFilter forceLogoutProcess = new LogoutFilter();
    forceLogoutProcess.setNext(ForceLogoutResource.class);

    Router router = (Router)super.createInboundRoot();
    router.attach("/logout/{token}", LogoutResource.class); 

    router.attach("/logout", forceLogoutProcess);
    router.attach("/login", loginProcess);

我想在此结构中添加另一个过滤器(InputRequestFilter,它将验证所有请求的输入)。

路由最终应如下所示:

request -> InputRequestFilter -> LogoutResource

request -> InputRequestFilter -> loginProcess 

request -> InputRequestFilter -> forceLogoutProcess 

我的问题是:

  1. InputRequestFilter应该Filter还是其他类型?
  2. 我究竟如何构建路由?
  3. 感谢。

1 个答案:

答案 0 :(得分:2)

如果您想在所有请求前添加过滤器,我们可以执行以下操作:

Router router = new Router(getContext());

InputRequestFilter inputRequestFilter = new InputRequestFilter(getContext());
inputRequestFilter.setNext(router);
return inputRequestFilter;

方法setNext接受任何Restlet(路由器,过滤器,资源,直接扩展类Restlet,守护等的类)。

我不知道你想在新过滤器中实现什么,但它似乎是正确的方法。

我们还可以注意到,您还可以通过利用匹配模式进行更高级的路由配置,如下所述:

Router subRouter = new Router(getContext());
(...)

// something to attach (sub router, ...
router.attach("/path/{pathvariable}", subRouter)
      .setMatchingMode(Template.MODE_STARTS_WITH);

使用此功能时,请注意,因为子路由器的路径变量仅在连接到子路由器的元素中可用。

希望它可以帮到你, 亨利