如何在 Restlet 中创建全局和 Pre/Post 匹配过滤器

How to create Global and Pre/Post matching filter in Restlet

我有两个要求

  1. 需要创建一个过滤器,该过滤器应在每个和之前应用 每个资源。
  2. 需要创建两个过滤器 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中的pre和post过滤器,只需在过滤器class.[=17中分别实现beforeHandleafterHandle方法即可=]

    public class MyGlobalFilter extends Filter {
        (...)
        @Override
        protected void afterHandle(Request request, Response response) {
            (...)
        }
    
        @Override
        protected int beforeHandle(Request request, Response response) {
            (...)
        }
    }
    

    要应用这样的过滤器,Restlet中没有对应的注解。您需要在应用程序 class 的 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;
        }
    }
    

希望对你有帮助, 蒂埃里