Cq5.5将servlet过滤器应用于特定路径

Bro*_*die 6 osgi servlet-filters aem

我正在使用cq5.5中的自定义表单处理程序,一切都很顺利.我现在正在努力锁定一些安全性,我的一个任务是实现对表单处理程序路径的请求限制过滤器.

目前我有类似的东西

@Component(immediate = true, metatype = true)

@Service(javax.servlet.Filter.class)

@Properties({
  @Property(name="service.pid", value="com.xxxxxx.cq.core.filter.FormFilter",propertyPrivate=false),
  @Property(name="service.description",value="FormFilter", propertyPrivate=false),
  @Property(name="service.vendor",value="xxxxxx - Microsites", propertyPrivate=false),
  @Property(name = "filter.scope", value = "request"),
  @Property(name = "sling.filter.scope", value = "request"),
  @Property(name = "service.ranking", intValue = 100001)
})

public class FormFilter implements javax.servlet.Filter {
  private Logger LOGGER = LoggerFactory.getLogger(TrackingFilter.class.getName());
  private static final Object lock = new Object();

  @Override
  public void doFilter(ServletRequest pRequest, ServletResponse pResponse, FilterChain pChain) throws IOException, ServletException {
      //my filter stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想将其锁定为仅在特定路径上运行.

感谢任何见解.

----编辑-----在做了更多研究之后,我发现了一些帖子,说明没有办法将过滤器注册到默认ServletFilter处理程序的指定路径.基本上我发现的这个问题的两个解决方案是为过滤器创建一个新的OSGI包并使用ExtHTTPService或Whiteboard注册它:

http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

要么

过滤掉过滤器内的网址.所以基本上在我的过滤器中添加对指定路径的检查.

即:

  @Override
  public void doFilter(ServletRequest pRequest, ServletResponse pResponse, FilterChain pChain) throws IOException, ServletException {

      String path = pRequest.getContextPath();

      if (path.contains("my/matching/path")
      {
        //my filter stuff
      }
  }
Run Code Online (Sandbox Code Playgroud)

我很想看看这个问题是否还有其他解决方案,但想分享我迄今为止能够找到的内容,希望这有助于激发更多想法,甚至只是帮助有同样问题的人保存一些谷歌搜索的时间.

谢谢你,布罗迪

Oli*_*ver 8

@TomekRękawek:::这不是真的.... 您可以将过滤器映射到路径.我是按照以下方式完成的,请参阅下面的代码.

@SlingFilter(order=1)
@Properties({
    @Property(name="service.pid", value="com.videojet.hiresite.filters.AddNewUserFilter",propertyPrivate=false),
    @Property(name="service.description",value="Authentication Filter", propertyPrivate=false),
    @Property(name="service.vendor",value="Zensar Tech", propertyPrivate=false),
    @Property(name="pattern",value="/services/videojet/v1/AddNewUserController/view", propertyPrivate=false)    
})
public class AddNewUserFilter implements javax.servlet.Filter{

    private final Logger log = LoggerFactory.getLogger(this.getClass());
    public void destroy() {
        // TODO Auto-generated method stub

    }
......
Run Code Online (Sandbox Code Playgroud)

属性"模式"将过滤器映射到URL.别忘了使用@SlingFilter

在模式属性中,你可以使用regx"/.*".这是经过试用和测试的代码.

此外,无需在bundle activator或ExtHttpSevice中注册它.

  • 根据吊索文档..."将过滤器限制为与提供的正则表达式匹配的路径.需要Sling Engine 2.4.0".... http://sling.apache.org/documentation/the-sling-engine/ filters.html (2认同)

Tom*_*wek 4

  1. 您的见解是正确的:无法将过滤器绑定到路径。您应该手动检查(不要忘记致电chain.doFilter())。

  2. 替代选项是OptingServlet. 它是一个提供一种方法的接口:accepts(SlingHttpServletRequest request)。在您的中实现此接口Sling[Safe|All]MethodsServlet允许您定义您感兴趣的请求类型。

  3. 另一种选择是使用选择器而不是路径片段。例如。/content/geometrixx/en.my-selector.html对于带有选择器的所有请求(如),将调用具有以下注释的 servlet :

    @SlingServlet(selectors = "my-selector", resourceTypes="sling/servlet/default")
    
    Run Code Online (Sandbox Code Playgroud)

旁注:您可能想使用这个漂亮的注释来声明过滤器:

@SlingFilter(scope = SlingFilterScope.REQUEST, order = 100001)
Run Code Online (Sandbox Code Playgroud)

它会自动添加@Component和@Service声明。