【问题标题】:Apache Felix Filter IssueApache Felix 过滤器问题
【发布时间】:2013-12-17 02:38:32
【问题描述】:

我正在开发一个 Apache Sling WCMS 应用程序。我需要过滤发送到服务器的所有请求并在响应对象中设置一些标头。我根据Felix Http Filter Sample 实现了过滤器和捆绑激活器类,并作为捆绑安装到吊索。

过滤器类:

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);
    }
}

上面的代码有问题。它不起作用,不会过滤任何请求。

提前感谢任何帮助。

【问题讨论】:

    标签: java servlet-filters apache-felix sling osgi-bundle


    【解决方案1】:

    请注意,您可以使用作为 OSGi 声明式服务 (DS) 实现的 Sling 过滤器以更简单的方式实现这一点。

    然后,您只需要在过滤器中添加一些注释,不需要激活器,并且为处理 DS 注释的 Maven 插件设置正确的 pom.xml。

    文档位于 https://sling.apache.org/documentation/the-sling-engine/filters.html,它指向 Sling 集成测试中的 NoPropertyFilter 示例。

    【讨论】:

    • 谢谢。你能说一下使用激活器有什么问题吗?使用注解,而不是激活器类,有什么特别的好处吗?此类服务有什么特殊的申报标准吗?
    • 使用 Activator 并没有什么问题,但它的代码要多得多,其中大部分是样板文件。声明式服务还将自动处理服务之间的依赖关系,在您的情况下,您必须手动完成。声明此类服务没有特殊标准,上面提到的 NoPropertyFilter 示例就是典型的。
    【解决方案2】:

    我发现我的过滤器没有被服务跟踪器跟踪,所以通过将参数 'true' 传递给 tracker.open() 来跟踪过滤器:

    this.tracker.open(true);
    

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2017-12-31
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2013-07-14
      • 2012-12-08
      • 2011-08-04
      相关资源
      最近更新 更多