我正在使用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
}
}
这样可以正常工作,但我想将其锁定为仅在特定路径上运行。
感谢任何见解。
---- ----- EDIT 在做了更多研究之后,我发现了一些帖子,说明没有办法将过滤器注册到默认ServletFilter处理程序的指定路径。基本上我发现的这个问题的两个解决方案是为过滤器创建一个新的OSGI包并使用ExtHTTPService或Whiteboard注册它:
http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html
OR
过滤掉过滤器内的网址。所以基本上在我的过滤器中添加对指定路径的检查。
即:
@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
}
}
我很想看看这个问题是否还有其他解决方案,但想分享我迄今为止能够找到的内容,希望这可以帮助激发更多想法,甚至只是帮助有相同想法的人问题可以节省谷歌搜索的时间。
谢谢你, 布罗迪答案 0 :(得分: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
}
......
属性“模式”将过滤器映射到URL。
不要忘记使用@SlingFilter
在模式属性中,你可以使用regx“/.*”。 这是经过试用和测试的代码。
此外,无需在bundle activator或ExtHttpSevice中注册它。
答案 1 :(得分:4)
您的见解是正确的:无法将过滤器绑定到路径。您应该手动检查(不要忘记致电chain.doFilter()
)。
替代选项是OptingServlet
。它是一个提供一种方法的接口:accepts(SlingHttpServletRequest request)
。在Sling[Safe|All]MethodsServlet
中实现此界面可让您定义您感兴趣的请求类型。
另一种选择是使用selector而不是路径片段。例如。将使用选择器(如/content/geometrixx/en.my-selector.html
):
@SlingServlet(selectors = "my-selector", resourceTypes="sling/servlet/default")
旁注:你可能想使用这个漂亮的注释来声明一个过滤器:
@SlingFilter(scope = SlingFilterScope.REQUEST, order = 100001)
它会自动添加@Component
和@Service
声明。