ROOT.war, root context, wildcard virtual hosts?
teej Apr 17, 2005 10:22 PMWorking with JBoss 4.0.1 & Tomcat with the 'default' server configuration.
How can I have a root-context application respond to all hostnames that resolve to an IP address that JBoss/Tomcat is configured to listen on?
E.g.
*.domain.name
*.domain.biz
*.domain.org
As you'll see from my detailed explanation below, I've tried the obvious way and ended up with errors that suggest I'm trying to use Java Server Faces when in fact I've just got a simple servlet that handles doGet() and doPost().
Explanation:
I am developing a web application that begins with a single "TrafficManager" servlet that returns a database-generated member-profile page in the following circumstances:
**Preferred URL** (not yet found a way to do this)
http://username1.domain.name
http://username2.domain.biz
http://username3.domain.org
**Alternate URL** (this works)
http://domain.name/username1
http://domain.biz/username2
http:/domain.org/username3
This deploys (as ROOT.war) and works for the *Alternate URL* case with a single servlet set as the root (/) context, where there is a WEB-INF/jboss-web.xml containing:
<?xml version="1.0"?> <jboss-web> <virtual-host>domain.name</virtual-host> <virtual-host>domain.biz</virtual-host> <virtual-host>domain.org</virtual-host> <context-root>/</context-root> </jboss-web>
And jboss-4.0.1\server\default\deploy\jbossweb-tomcat50.sar\server.xml contains:
<!-- HTTP/1.1 Connector --> <Connector port="80" address="x.y.z.245" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"/> <Host name="domain.name"> <Alias>www.domain.name</Alias> </Host> <Host name="domain.org"> <Alias>www.domain.org</Alias> </Host> <Host name="domain.biz"> <Alias>www.domain.biz</Alias> </Host>
Note: neither the < virtual-host >, < Host > or < Alias > elements appear to support wildcard hostnames such as *.domain.name.
The Servlet simply contains:
package net.phwoarrr.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TrafficManager extends HttpServlet { public TrafficManager() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println("<HEAD><TITLE>Member Bio for " + request.getPathInfo() + "</TITLE></HEAD>"); out.println("<BODY>"); out.println("<h1>Member Bio for " + request.getPathInfo() + "</h1>"); out.print("This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println("<HEAD><TITLE>Member Bio for " + request.getPathInfo() + "</TITLE></HEAD>"); out.println("<BODY>"); out.println("<h1>Member Bio for " + request.getPathInfo() + "</h1>"); out.print(this.getClass()); out.println(", using the POST method"); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void init() throws ServletException { // Put your code here } }
However, when I aim to have the web application respond to *ALL* root-context HTTP-Requests (no matter what the hostname/IP is) by removing the <virtual-host> tags from jboss-web.xml, the JBoss/Tomcat deployer throws exceptions and cannot deploy the application.
As you will see from the error report below, there is a suggestion that Java Server Faces is being deployed in the ROOT.war when in fact the ONLY change is to remove the <virtual-host> entries from jboss-web.xml.
Here is a link to the http://tjworld.net/help/kb/jboss-server.log.txt which contains a lot more detail than I've posted here.
2005-04-18 02:38:56,121 DEBUG [tomcat.localhost.ROOT.Context] Configuring application event listeners 2005-04-18 02:38:56,121 DEBUG [tomcat.localhost.ROOT.Context] Configuring event listener class 'com.sun.faces.config.ConfigureListener' 2005-04-18 02:38:56,137 ERROR [org.jboss.web.localhost.Engine] StandardContext[]Error configuring application listener of class com.sun.faces.config.ConfigureListener java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListener at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3775) ... at $Proxy8.deploy(Unknown Source) at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:305) at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:463) at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:204) at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.loop(AbstractDeploymentScanner.java:215) at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.run(AbstractDeploymentScanner.java:194) 2005-04-18 02:38:56,152 ERROR [tomcat.localhost.ROOT.Context] Skipped installing application listeners due to previous error(s) 2005-04-18 02:38:56,152 ERROR [tomcat.localhost.ROOT.Context] Error listenerStart 2005-04-18 02:38:56,152 ERROR [tomcat.localhost.ROOT.Context] Context startup failed due to previous errors 2005-04-18 02:38:56,152 DEBUG [tomcat.localhost.ROOT.Context] Stopping 2005-04-18 02:38:56,168 DEBUG [tomcat.localhost.ROOT.Context] Stopping filters 2005-04-18 02:38:56,168 DEBUG [tomcat.localhost.ROOT.Context] Processing standard container shutdown 2005-04-18 02:38:56,184 DEBUG [tomcat.localhost.ROOT.Context] Sending application stop events 2005-04-18 02:38:56,184 DEBUG [tomcat.localhost.ROOT.Context] resetContext jboss.web:j2eeType=WebModule,name=//localhost/,J2EEApplication=none,J2EEServer=none org.jboss.mx.server.MBeanServerImpl@107ebe1 2005-04-18 02:38:56,184 DEBUG [tomcat.localhost.ROOT.Context] Stopping complete
REMEMBER - Simply adding one or more <virtual-host> elements to the jboss-web.xml and this web application runs perfectly.
A successful deployment when <virtual-host> elements are used, looks like this:
2005-04-18 03:15:29,223 DEBUG [tomcat.domain.name.ROOT.Context] Configuring application event listeners 2005-04-18 03:15:29,223 DEBUG [tomcat.domain.name.ROOT.Context] Sending application start events 2005-04-18 03:15:29,223 DEBUG [tomcat.domain.name.ROOT.Context] Starting filters 2005-04-18 03:15:29,223 DEBUG [tomcat.domain.name.ROOT.Context] Starting filter 'CommonHeadersFilter' 2005-04-18 03:15:29,239 DEBUG [org.jboss.web.tomcat.filters.ReplyHeaderFilter] Adding header name: X-Powered-By='Servlet 2.4; Tomcat-5.0.28/JBoss-4.0.1 (build: CVSTag=JBoss_4_0_1 date=200412230944)' 2005-04-18 03:15:29,239 DEBUG [tomcat.domain.name.ROOT.Context] Starting completed 2005-04-18 03:15:29,239 DEBUG [tomcat.domain.name.ROOT.Context] Checking for jboss.web:j2eeType=WebModule,name=//domain.name/,J2EEApplication=none,J2EEServer=none 2005-04-18 03:15:29,270 DEBUG [org.jboss.web.tomcat.tc5.TomcatDeployer] Initialized: {WebApplication: /D:/Server/Java/jboss-4.0.1/server/default/tmp/deploy/tmp50102ROOT-exp.war/, URL: file:/D:/Server/Java/jboss-4.0.1/server/default/tmp/deploy/tmp50102ROOT-exp.war/, classLoader: java.net.FactoryURLClassLoader@1132e76:18034294} jboss.web:j2eeType=WebModule,name=//domain.name/,J2EEApplication=none,J2EEServer=none 2005-04-18 03:15:29,270 DEBUG [org.jboss.web.tomcat.tc5.TomcatDeployer] deploy root context=/ 2005-04-18 03:15:29,270 INFO [org.jboss.web.tomcat.tc5.TomcatDeployer] deploy, ctxPath=/, warUrl=file:/D:/Server/Java/jboss-4.0.1/server/default/tmp/deploy/tmp50102ROOT-exp.war/ 2005-04-18 03:15:29,488 DEBUG [org.jboss.web.tomcat.tc5.TomcatDeployer] Using session cookies default setting