Java ApacheFelix过滤器问题
我正在开发一个Apache Sling WCMS应用程序。我需要过滤发送到服务器的所有请求,并在响应对象中设置一些头。我根据实现了过滤器和bundle activator类,并作为bundle-to-sling安装 文件管理器类:Java ApacheFelix过滤器问题,java,servlet-filters,apache-felix,sling,osgi-bundle,Java,Servlet Filters,Apache Felix,Sling,Osgi Bundle,我正在开发一个Apache Sling WCMS应用程序。我需要过滤发送到服务器的所有请求,并在响应对象中设置一些头。我根据实现了过滤器和bundle activator类,并作为bundle-to-sling安装 文件管理器类: import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IO
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HeaderFilter implements Filter {
private final String name;
public HeaderFilter(String name) {
this.name = name;
}
public void init(FilterConfig config) throws ServletException {
doLog("Init with config [" + config + "]");
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
try {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
doLog("Filter request [" + request + "]");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "-1");
chain.doFilter(req, response);
} catch (Exception e) {
e.printStackTrace();
}
}
public void destroy() {
doLog("Destroyed filter");
}
private void doLog(String message) {
System.out.println("## [" + this.name + "] " + message);
}
}
束激活器类:
import org.apache.felix.http.api.ExtHttpService;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import java.util.Dictionary;
import java.util.Hashtable;
public class Activator implements BundleActivator {
private ServiceTracker tracker;
private HeaderFilter filter1 = new HeaderFilter("filter1");
Dictionary hashTable = new Hashtable<Object, Object>();
public void start(BundleContext context) throws Exception {
try {
this.tracker = new ServiceTracker(context, ExtHttpService.class.getName(), null) {
@Override
public Object addingService(ServiceReference ref) {
Object service = super.addingService(ref);
serviceAdded((ExtHttpService) service);
return service;
}
@Override
public void removedService(ServiceReference ref, Object service) {
serviceRemoved((ExtHttpService) service);
super.removedService(ref, service);
}
};
this.tracker.open();
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop(BundleContext context)
throws Exception {
this.tracker.close();
}
private void serviceAdded(ExtHttpService service) {
try {
hashTable.put("filter.scope", new String[]{"request", "forward", "include"});
service.registerFilter(this.filter1, ".*", hashTable, 0, null);
} catch (Exception e) {
e.printStackTrace();
}
}
private void serviceRemoved(ExtHttpService service) {
service.unregisterFilter(this.filter1);
}
}
import org.apache.felix.http.api.ExtHttpService;
导入org.osgi.framework.BundleActivator;
导入org.osgi.framework.BundleContext;
导入org.osgi.framework.ServiceReference;
导入org.osgi.util.tracker.ServiceTracker;
导入java.util.Dictionary;
导入java.util.Hashtable;
公共类激活器实现BundleActivator{
私人服务跟踪器;
专用头过滤器过滤器1=新头过滤器(“过滤器1”);
字典哈希表=新哈希表();
public void start(BundleContext)引发异常{
试一试{
this.tracker=newServiceTracker(上下文,ExtHttpService.class.getName(),null){
@凌驾
公共对象添加服务(ServiceReference ref){
对象服务=超级添加服务(ref);
serviceAdded((ExtHttpService)服务);
回程服务;
}
@凌驾
public void removedService(ServiceReference ref,Object service){
serviceRemoved((ExtHttpService)服务);
超级远程服务(参考,服务);
}
};
this.tracker.open();
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效停止(BundleContext)
抛出异常{
this.tracker.close();
}
已添加专用void服务(ExtHttpService服务){
试一试{
put(“filter.scope”,新字符串[]{“request”,“forward”,“include”});
service.registerFilter(this.filter1,“*”,哈希表,0,null);
}捕获(例外e){
e、 printStackTrace();
}
}
已删除专用void服务(ExtHttpService服务){
service.unregisterFilter(this.filter1);
}
}
这是上面代码的一个问题。它不工作,不会过滤任何请求
提前感谢您的帮助。我发现服务跟踪器没有跟踪我的筛选器,因此通过将参数“true”传递给跟踪器。open()跟踪筛选器:
this.tracker.open(true);
请注意,您可以使用作为OSGi声明性服务(DS)实现的Sling过滤器以更简单的方式实现这一点 然后,您只需要在过滤器中添加一些注释,而不需要使用Activator,并为处理DS注释的Maven插件提供正确的pom.xml设置
文档位于,它指向吊索集成测试中的示例。谢谢。您能告诉我使用activator有什么问题吗?使用注释而不是activator类具有特殊的优势?有什么特殊的标准来声明这样的服务吗?使用激活器没有什么错,但它的代码要多得多,大部分都是样板文件。声明性服务还将自动处理服务之间的依赖关系,在您的情况下,您必须手动处理这些依赖关系。声明此类服务没有特殊的标准,上面提到的NoPropertyFilter示例是典型的。