Felix OSGi Servlet /资源过滤器不会过滤

时间:2017-07-25 08:56:48

标签: java servlets jetty osgi apache-felix

我正在尝试过滤OSGi Apache-Felix中Jetty HTTP服务器的Web资源。

我已在框架中将过滤器注册为OSGi组件:

@Component(property = { "osgi.http.whiteboard.filter.name=MyFilter",
                        "osgi.http.whiteboard.filter.regex=.*" },
           scope = ServiceScope.PROTOTYPE)
public class MyFilter implements Filter {
    ...
    @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response,
                         FilterChain chain) {
       ...
       // some logging
    }
    ...
}

当我启动Felix框架并通过浏览器访问资源和servlet时,Filter#doFilter(...)方法永远不会被调用。

已使用org.osgi.service.http.HttpService#registerServlet(...)org.osgi.service.http.HttpService#registerResources(...)注册资源和servlet。

我确定,过滤器已初始化,因为Filter#init(...)被调用:

这里是组件的Felix scr信息:

Component Description:
  Name: org.myCompany.MyFilter
  Implementation Class: org.myCompany.MyFilter
  Default State: enabled
  Activation: delayed
  Configuration Policy: optional
  Activate Method: activate
  Deactivate Method: deactivate
  Modified Method: -
  Configuration Pid: [org.myCompany.MyFilter]
  Services: 
    javax.servlet.Filter
  Service Scope: prototype
  Component Description Properties:
      osgi.http.whiteboard.filter.name = MyFilter
      osgi.http.whiteboard.filter.regex = .*
  Component Configuration:
    ComponentId: 7
    State: active      
    Component Configuration Properties:
        component.id = 7
        component.name = org.myCompany.MyFilter
        osgi.http.whiteboard.filter.name = MyFilter
        osgi.http.whiteboard.filter.regex = .*
  • 资源/ servlet过滤是否在Felix,Jetty和OSGi中工作?
  • 我是否正确注册了过滤器?

与此同时,感谢您的关注和参与。

1 个答案:

答案 0 :(得分:0)

关于HttpService和Whiteboard Services之间的交互,R6规范并不清楚。事实上,RFC 0223的更新说:

  

3.1白板服务和Http服务(错误2872)

     

如果Http Whiteboard实现也在实现Http服务,那么   whiteboard规范没有指定是否是Http上下文   对于Http服务,表示为ServletContextHelper服务。   没有办法在Http中注册白板服务   Http服务的上下文。例如,为其添加servlet过滤器   由Http服务管理的所有servlet都是不可能的。

Felix实现不共享HttpContext和ServletContextHelper:您必须使用Http Whiteboard注册您的servlet才能使用您的过滤器。