2015-04-05 65 views
0

我有几个Resource类该有的都有过滤自己的LoginResourceForceLogoutResource)和一些不(LogoutResource)。的Restlet多滤波器实现

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. 应该InputRequestFilterFilter或其他类型的?
  2. 我该如何构建路由?

谢谢。

回答

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); 

使用此功能时,要小心,因为子路由器的路径变量只在附属于子路由器的元素内可用。

希望它可以帮助你, 蒂埃里

+0

感谢您的回答。为什么你为“开始”设置匹配器,是不是EQUALS_TO足够? – Igor 2015-04-07 08:27:30

+0

这只是告诉你,这是一种附加预处理元素子集的方法。在你的情况下,我认为匹配模式就足够了;-) – 2015-04-07 08:29:56