詳細信息, 我使用一個單一的碼頭服務器通過Java嵌入,將處理多個請求。我正在用guice注入事件監聽器和安全過濾器。但我需要服務器servlet的請求domian。我嘗試使用虛擬主機,但由於我沒有使用基於xml的配置,因此沒有太多文檔可以獲得幫助。嵌入式jetty和guice處理程序servlet根據請求域(虛擬主機)
,所以我想是 -
如果域A.B.C - >處理AHandler和濾波應用AFilter,
如果域b.b.c - >處理BHandler和過濾應用BFilter。
我Contex的初始化是這樣的:
getHandler(server) {
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setVirtualHosts(new String[]{HOST});
handler.setClassLoader(Thread.currentThread().getContextClassLoader());
handler.setServer(server);
handler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
handler.setContextPath("/");
handler.addEventListener(new ServerContextListener());
}
Listener類
class ServerContextListener extends GuiceServletContextListener {
private ServletContext servletContext;
public ServletContext getServletContext() {
return servletContext;
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
this.servletContext = checkNotNull(servletContextEvent.getServletContext(), "servletContext");
super.contextInitialized(servletContextEvent);
}
@Override
protected Injector getInjector() {
return Guice.createInjector(getModules());
}
private Iterable<Module> getModules() {
return ImmutableList.of(
new SecurityModule(getServletContext()),
new ResourceModule());
}
}
安全模塊:
class SecurityModule extends ShiroWebModule {
public SecurityModule(ServletContext servletContext) {
super(servletContext);
}
@SuppressWarnings("unchecked")
@Override
protected void configureShiroWeb() {
addFilterChain("/**", AUTHC_BASIC);
}
}
class ResourceModule extends ServletModule {
@Override
protected void configureServlets() {
serve("/*").with(AServlet.class);
}
}
而在這樣的服務器:
Server server = new Server(new InetSocketAddress("0.0.0.0", 8585));
HandlerCollection handler = new HandlerCollection();
handler.addHandler(AContext.getHandler(server));
handler.addHandler(BContext.getHandler(server));
server.setHandler(handler);
server.start();
和AServlet和BServlet都是常規的servlet,具有post post方法。
但是我的執行沒有按預期工作。它將所有請求發送到註冊的最後處理程序。
需要一些幫助來完成我所需要的。我做錯事的地方在哪裏?
AContext.getHandler(服務器)返回第一限定的ServletContextHandler。這不夠嗎? HOST是一個格式化爲a.test.com的字符串,我想處理它。如果AServlet的overriden方法需要設置request.setHandled(true)? – sadlil
看起來像這不工作。 ContextHandler vhwrapper = new ContextHandler(handler); – sadlil
用上下文處理程序不工作來包裝ServletContextHandler。仍然是註冊的最後一個人收到了請求。 – sadlil