【发布时间】:2016-01-07 12:16:09
【问题描述】:
我有两个要求
- 需要创建一个过滤器,应该在每个过滤器和 每个资源。
- 需要创建两个过滤器 Pre 和 Post 与 Jersey 相同。
【问题讨论】:
我有两个要求
【问题讨论】:
在 Restlet 中为请求配置执行链非常灵活。
要为所有服务器资源创建全局过滤器,您只需在 Restlet 应用程序中的路由器前面添加过滤器:
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);
}
}
这个过滤器的内容可能是这样的:
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) {
(...)
}
}
关于 Restlet 中的前置过滤器和后置过滤器,只需在过滤器类中分别实现 beforeHandle 和 afterHandle 方法即可。
public class MyGlobalFilter extends Filter {
(...)
@Override
protected void afterHandle(Request request, Response response) {
(...)
}
@Override
protected int beforeHandle(Request request, Response response) {
(...)
}
}
要应用此类过滤器,Restlet 中没有相应的注释。您需要在应用程序类的createInboundRoot 方法中定义执行链(路由)时添加它们。您会注意到子路由器可用于仅对服务器资源的子集应用过滤器。
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;
}
}
希望对你有帮助 蒂埃里
【讨论】: