我正在尝试过滤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 才能使用您的过滤器。