【问题标题】:Felix OSGi Servlet/Resource Filter does not filterFelix OSGi Servlet/资源过滤器不过滤
【发布时间】:2017-12-31 02:17:00
【问题描述】:

我正在尝试在 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 中工作?
  • 我是否正确注册了过滤器?

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

【问题讨论】:

  • OSGi 提供基于正则表达式的过滤??这在 Servlet 规范中不受支持。顺便说一句:(正则表达式).* ==(servlet)/*

标签: java servlets jetty osgi apache-felix


【解决方案1】:

R6 规范对 HttpService 和 Whiteboard Services 之间的交互没有明确规定。事实上,RFC 0223 的更新说:

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

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

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

【讨论】:

  • 谢谢,过滤器在向 Http Whiteboard 注册后工作。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 2013-12-17
  • 1970-01-01
  • 2011-11-01
  • 2016-08-16
  • 2011-02-15
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多