I have two requirements
Configuring the execution chain for requests in Restlet is very flexible.
To create a global filter for all servers resources, you can simply add the filter in front of your router within your Restlet application:
public class MyApplication extends Application {
public Restlet createInboundRoot() {
Router router = new Router(getContext());
(...)
router.attach("/test", TestServerResource.class);
router.attach("/", RootServerResource.class);
return new MyFilter(getContext(), router);
}
}
The content of this filter could be something like that:
public class MyGlobalFilter extends Filter {
public MyGlobalFilter(Context context, Restlet next) {
super(context, next);
}
(...)
@Override
protected void afterHandle(Request request, Response response) {
(...)
}
@Override
protected int beforeHandle(Request request, Response response) {
(...)
}
}
Regarding pre and post filters in Restlet, simply implement respectively the beforeHandle
and afterHandle
methods in your filter class.
public class MyGlobalFilter extends Filter {
(...)
@Override
protected void afterHandle(Request request, Response response) {
(...)
}
@Override
protected int beforeHandle(Request request, Response response) {
(...)
}
}
To apply such filters, there is no corresponding annotations in Restlet. You need to add them when defining the execution chaining (routing) in the createInboundRoot
method of your application class. You can notice that sub routers can be used to only apply filter on a subset of server resources.
public class MyApplication extends Application {
public Restlet createInboundRoot() {
Router rootRouter = new Router(getContext());
(...)
Router subRouter = new Router(getContext());
subRouter.attach("", TestsServerResource.class);
subRouter.attach("{id}", TestServerResource.class);
MyFilter myFilter = new MyFilter(getContext(), subRouter);
rootRouter.attach("/test", myFilter)
.setMatchingMode(Template.MODE_STARTS_WITH);
return rootRouter;
}
}
Hope it helps you, Thierry