我正在 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
}
}
这工作正常,但我想将其锁定为仅在特定路径上运行。
感谢您的任何见解。
- - 编辑 - - -
经过更多研究后,我发现一些帖子指出无法将过滤器注册到默认 ServletFilter 处理程序的指定路径。基本上,我发现这个问题的两个解决方案是为过滤器创建一个新的 OSGI 包并使用 ExtHTTPService 或 Whiteboard 注册它:
http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html
OR
过滤掉过滤器本身内的 url。所以基本上在我的过滤器中添加对指定路径的检查。
i.e:
@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
}
}
我很想看看这个问题是否有其他解决方案,但想分享我到目前为止找到的内容,希望这能帮助激发更多的想法,甚至只是帮助有同样问题的人节省一些谷歌搜索的时间。
谢谢你,
布罗迪