【问题标题】:How to create Global and Pre/Post matching filter in Restlet如何在 Restlet 中创建全局和前/后匹配过滤器
【发布时间】:2016-01-07 12:16:09
【问题描述】:

我有两个要求

  1. 需要创建一个过滤器,应该在每个过滤器和 每个资源。
  2. 需要创建两个过滤器 Pre 和 Post 与 Jersey 相同。

【问题讨论】:

    标签: rest restlet


    【解决方案1】:

    在 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 中的前置过滤器和后置过滤器,只需在过滤器类中分别实现 beforeHandleafterHandle 方法即可。

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

    希望对你有帮助 蒂埃里

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2014-09-24
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多