2015-04-05 66 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