我尝试结合 VAADIN 和 shiro 在 OSGI 环境中实现 HttpService。所以我声明了以下BundleActivator:
import java.util.logging.Level;
import org.eclipse.equinox.http.servlet.ExtendedHttpService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpContext;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
/**
*
* @author nspecht
*/
public class BundleActivator extends some.package.BundleActivator implements ServiceTrackerCustomizer
{
/**
* Service tracker.
*/
private ServiceTracker tracker;
/**
* HttpService.
*/
private ExtendedHttpService httpService;
@Override
protected void afterStart(BundleContext bc, DependencyManager dm) {
this.tracker = new ServiceTracker(this.context, ExtendedHttpService.class, this);
this.tracker.open();
}
@Override
protected void beforeStop(BundleContext bc, DependencyManager dm) {
if (this.tracker != null) {
this.tracker.close();
this.tracker = null;
}
}
@Override
protected void afterBundleChanged(BundleEvent be) {
}
@Override
public Object addingService(ServiceReference sr) {
this.httpService = (ExtendedHttpService)this.context.getService(sr);
HttpContext httpContext = this.httpService.createDefaultHttpContext();
try {
MainServlet mainServlet = new MainServlet();
this.httpService.registerServlet(MainServlet.PATH, mainServlet, null, httpContext);
// TODO: add ServletContextListener and Filter
LoginServlet loginServlet = new LoginServlet();
this.httpService.registerServlet(LoginServlet.PATH, loginServlet, null, httpContext);
// TODO: add ServletContextListener and Filter
} catch (Exception ex) {
Logger.getLogger(BundleActivator.class.getName()).log(Level.SEVERE, null, ex);
}
return this.httpService;
}
@Override
public void modifiedService(ServiceReference sr, Object t) {
}
@Override
public void removedService(ServiceReference sr, Object t) {
this.httpService.unregister(MainServlet.PATH);
this.httpService.unregister(LoginServlet.PATH);
// TODO: remove ServletContextListener and Filter
}
}
MyServlets 是 VaadinServlets。现在我想将 Shiro 添加到我的应用程序中。为了使 shiro 正常工作,我必须将 EnvironmentLoaderListemer 和 ShiroFilter 添加到我的服务中。
如果我尝试以下操作:
mainServlet.mainServlet.getServletContext().addListener(...)
应用程序崩溃(因为上下文已经被初始化)。
mainServlet.getServletContext().createListener(...)
不会引发异常,但 ServletContextListener 也不起作用。httpService 没有以这种方式添加侦听器的方法。过滤器也有同样的问题,当监听器没有注册 EnvironmentLoader 时,httpService.registerFilter(...) 方法对 ShiroFilter 是无用的。
是否有以编程方式添加 Shiro 的解决方法?
有没有办法为我的 Servlet 添加监听器和过滤器?