📄 webxml2jk.java
字号:
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jk.config;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.Hashtable;
import java.util.Vector;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.tomcat.util.IntrospectionUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/* Naming conventions:
JK_CONF_DIR == serverRoot/work ( XXX /jkConfig ? )
- Each vhost has a sub-dir named after the canonycal name
- For each webapp in a vhost, there is a separate WEBAPP_NAME.jkmap
- In httpd.conf ( or equivalent servers ), in each virtual host you
should "Include JK_CONF_DIR/VHOST/jk_apache.conf". The config
file will contain the Alias declarations and other rules required
for apache operation. Same for other servers.
- WebXml2Jk will be invoked by a config tool or automatically for each
webapp - it'll generate the WEBAPP.jkmap files and config fragments.
WebXml2Jk will _not_ generate anything else but mappings.
It should _not_ try to guess locations or anything else - that's
another components' job.
*/
/**
* Read a web.xml file and generate the mappings for jk2.
* It can be used from the command line or ant.
*
* In order for the web server to serve static pages, all webapps
* must be deployed on the computer that runs Apache, IIS, etc.
*
* Dynamic pages can be executed on that computer or other servers
* in a pool, but even if the main server doesn't run tomcat,
* it must have all the static files and WEB-INF/web.xml.
* ( you could have a script remove everything else, including jsps - if
* security paranoia is present ).
*
* XXX We could have this in WEB-INF/urimap.properties.
*
* @author Costin Manolache
*/
public class WebXml2Jk {
String vhost="";
String cpath="";
String docBase;
String file;
String worker="lb";
// -------------------- Settings --------------------
// XXX We can also generate location-independent mappings.
/** Set the canonycal name of the virtual host.
*/
public void setHost( String vhost ) {
this.vhost=vhost;
}
/** Set the canonical name of the virtual host.
*/
public void setContext( String contextPath ) {
this.cpath=contextPath;
}
/** Set the base directory where the application is
* deployed ( on the web server ).
*/
public void setDocBase(String docBase ) {
this.docBase=docBase;
}
// Automatically generated.
// /** The file where the jk2 mapping will be generated
// */
// public void setJk2Conf( String outFile ) {
// file=outFile;
// type=CONFIG_JK2_URIMAP;
// }
// /** Backward compat: generate JkMounts for mod_jk1
// */
// public void setJkmountFile( String outFile ) {
// file=outFile;
// type=CONFIG_JK_MOUNT;
// }
/* By default we map to the lb - in jk2 this is automatically
* created and includes all tomcat instances.
*
* This is equivalent to the worker in jk1.
*/
public void setGroup(String route ) {
worker=route;
}
// -------------------- Generators --------------------
public static interface MappingGenerator {
void setWebXmlReader(WebXml2Jk wxml );
/** Start section( vhost declarations, etc )
*/
void generateStart() throws IOException ;
void generateEnd() throws IOException ;
void generateServletMapping( String servlet, String url )throws IOException ;
void generateFilterMapping( String servlet, String url ) throws IOException ;
void generateLoginConfig( String loginPage,
String errPage, String authM ) throws IOException ;
void generateErrorPage( int err, String location ) throws IOException ;
void generateConstraints( Vector urls, Vector methods, Vector roles, boolean isSSL ) throws IOException ;
}
// -------------------- Implementation --------------------
Node webN;
File jkDir;
/** Return the top level node
*/
public Node getWebXmlNode() {
return webN;
}
public File getJkDir() {
return jkDir;
}
/** Extract the wellcome files from the web.xml
*/
public Vector getWellcomeFiles() {
Node n0=getChild( webN, "welcome-file-list" );
Vector wF=new Vector();
if( n0!=null ) {
for( Node mapN=getChild( webN, "welcome-file" );
mapN != null; mapN = getNext( mapN ) ) {
wF.addElement( getContent(mapN));
}
}
// XXX Add index.html, index.jsp
return wF;
}
void generate(MappingGenerator gen ) throws IOException {
gen.generateStart();
log.info("Generating mappings for servlets " );
for( Node mapN=getChild( webN, "servlet-mapping" );
mapN != null; mapN = getNext( mapN ) ) {
String serv=getChildContent( mapN, "servlet-name");
String url=getChildContent( mapN, "url-pattern");
gen.generateServletMapping( serv, url );
}
log.info("Generating mappings for filters " );
for( Node mapN=getChild( webN, "filter-mapping" );
mapN != null; mapN = getNext( mapN ) ) {
String filter=getChildContent( mapN, "filter-name");
String url=getChildContent( mapN, "url-pattern");
gen.generateFilterMapping( filter, url );
}
for( Node mapN=getChild( webN, "error-page" );
mapN != null; mapN = getNext( mapN ) ) {
String errorCode= getChildContent( mapN, "error-code" );
String location= getChildContent( mapN, "location" );
if( errorCode!=null && ! "".equals( errorCode ) ) {
try {
int err=new Integer( errorCode ).intValue();
gen.generateErrorPage( err, location );
} catch( Exception ex ) {
log.error( "Format error " + location, ex);
}
}
}
Node lcN=getChild( webN, "login-config" );
if( lcN!=null ) {
log.info("Generating mapping for login-config " );
String authMeth=getContent( getChild( lcN, "auth-method"));
if( authMeth == null ) authMeth="BASIC";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -