我正在尝试过滤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 = .*
与此同时,感谢您的关注和参与。
答案 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才能使用您的过滤器。