因此,为了回答您的具体问题,如果您希望在调用组件之前执行过滤器,您将创建一个正在侦听组件级别过滤器范围的过滤器。
看
http://sling.apache.org/documentation/the-sling-engine/filters.html
然后您将让您的过滤器将传入请求更改为 SlingServletRequest 并确定目标资源是否是您正在寻找的资源。
但是,此过滤器将在页面中包含的每个组件上执行。可能对您有用的反向过程是 ResourceDecorator。
http://sling.apache.org/documentation/the-sling-engine/wrap-or-decorate-resources.html
这些在资源被识别时执行,在 servlet 和过滤器调用之前,这将允许您验证资源是否是您感兴趣的类型,然后允许您向资源对象添加附加信息.然而,这又是一项服务,将应用于识别的每个资源。
但是,如果您要查找的是仅针对特定路径执行的过滤器,则不需要。吊索不会那样做。您提到 Spring MVC 和 Spring MVC 的工作原理与 MVC 的 Slings 版本完全不同。
编辑
因此,在传统的 Web 应用程序中,servlet 将位于固定位置,并且在调用该 servlet 之前应用所有过滤器。在 Sling 中,您动态地将 servlet 连接在一起以生成结果页面。因此,每次您在 servlet 中并直接或间接调用请求调度程序时,它都会再次执行解析过程并在执行新的 servlet 之前应用一系列过滤器再次。
为了防止只需要应用于每个内部调度的主请求的高级过滤器,他们提出了上下文的想法,或者在不同时间应用并与不同类型相关联的过滤器链包括。
这是一个基本过滤器,它会在调用时记录一条消息。我是凭记忆做的,所以你需要接受它。
@SlingFilter(scope = SlingFilterScope.COMPONENT, order = Integer.MIN_VALUE)
public class SampleFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(SampleFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
Resource res = slingRequest.getResource();
if (!(res == null || ResourceUtil.isNonExistingResource(res))) {
LOG.error("this servlet is called before resource {} at path {}", res.getName(),res.getPath());
}
chain.doFilter(request, response);
}
}
其中重要的部分是 scope = SlingFilterScope.COMPONENT 看看我之前列出的页面并尝试 sligfilterscope 的不同组合,您会看到它在不同时间的应用情况. scope = SlingFilterScope.REQUEST 将在每页的顶层出现一次。