Felix OSGi Servlet/Resource Filter does not filter



我正在尝试过滤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(...)方法永远不会被调用。

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

我敢肯定,过滤器被初始化了,因为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 中是否有效?
  • 我是否正确注册了过滤器?

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

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

3.1 白板服务和 http 服务(bug 2872(

如果 Http 白板实现也在实现 Http 服务,则 白板规范未指定 Http 上下文是否 对于 Http 服务,表示为 ServletContextHelper 服务。 无法在 Http 中注册白板服务 HTTP 服务的上下文。例如,为 不可能由 Http 服务管理的所有 servlet。

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

相关内容

最新更新