Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheFelix过滤器问题_Java_Servlet Filters_Apache Felix_Sling_Osgi Bundle - Fatal编程技术网

Java ApacheFelix过滤器问题

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

我正在开发一个Apache Sling WCMS应用程序。我需要过滤发送到服务器的所有请求,并在响应对象中设置一些头。我根据实现了过滤器和bundle activator类,并作为bundle-to-sling安装

文件管理器类:

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示例是典型的。