📄 webxmlreader.java
字号:
package org.apache.tomcat.context;
import org.apache.tomcat.core.*;
import org.apache.tomcat.util.*;
import org.apache.tomcat.util.xml.*;
import java.beans.*;
import java.io.*;
import java.io.IOException;
import java.lang.reflect.*;
import java.util.*;
import java.util.StringTokenizer;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
/**
* @author costin@dnt.ro
*/
public class WebXmlReader extends BaseInterceptor {
public static final String defaultWelcomeList[]={"index.jsp", "index.html", "index.htm"};
public static final int DEFAULT_SESSION_TIMEOUT=30;
private static StringManager sm =StringManager.getManager("org.apache.tomcat.resources");
boolean validate=true;
public WebXmlReader() {
}
public void setValidate( boolean b ) {
validate=b;
}
private ServletWrapper addServlet( Context ctx, String name, String classN )
throws TomcatException
{
ServletWrapper sw=new ServletWrapper();
sw.setContext(ctx);
sw.setServletName( name );
sw.setServletClass( classN);
ctx.addServlet( sw );
sw.setLoadOnStartUp( -2147483646 );
return sw;
}
private void setDefaults( Context ctx )
throws TomcatException
{
// addServlet( ctx, "default", "org.apache.tomcat.servlets.DefaultServlet");
// addServlet( ctx, "invoker", "org.apache.tomcat.servlets.InvokerServlet");
ServletWrapper sw=addServlet( ctx, "jsp", "org.apache.jasper.servlet.JspServlet");
// sw.addInitParam("jspCompilerPlugin", "org.apache.jasper.compiler.JikesJavaCompiler");
// ctx.addServletMapping( "/servlet/*", "invoker");
ctx.addServletMapping( "*.jsp", "jsp");
ctx.setSessionTimeOut( 30 );
// mime-mapping - are build into MimeMap.
// Note that default mappings are based on existing registered types.
// index pages - still use the hack, but it'll go away soon
for( int i=0; i< defaultWelcomeList.length; i++ )
ctx.addWelcomeFile( defaultWelcomeList[i]);
ctx.expectUserWelcomeFiles();
}
private void readDefaultWebXml( Context ctx ) throws TomcatException {
ContextManager cm=ctx.getContextManager();
String home = cm.getHome();
File default_xml=new File( home + "/conf/web.xml" );
// try the default ( installation )
if( ! default_xml.exists() ) {
String tchome=ctx.getContextManager().getInstallDir();
if( tchome != null )
default_xml=new File( tchome + "/conf/web.xml");
}
if( ! default_xml.exists() )
return;
processWebXmlFile(ctx , default_xml.getPath());
ctx.expectUserWelcomeFiles();
}
public void contextInit(Context ctx) throws TomcatException {
if( ctx.getDebug() > 0 ) ctx.log("XmlReader - init " + ctx.getPath() + " " + ctx.getDocBase() );
ContextManager cm=ctx.getContextManager();
try {
// Default init
setDefaults( ctx );
// We may read a "default" web.xml from INSTALL/conf/web.xml -
// the code is commented out right now because we want to
// consolidate the config in server.xml ( or API calls ),
// we may put it back for 3.2 if needed.
// note that web.xml have to be cleaned up - only diff from
// default should be inside
// readDefaultWebXml( ctx );
File inf_xml = cm.getAbsolute( new File(ctx.getDocBase() +
"/WEB-INF/web.xml"));
if( inf_xml.exists() )
processWebXmlFile(ctx, inf_xml.getPath() );
} catch (Exception e) {
String msg = sm.getString("context.getConfig.e",ctx.getPath() + " " + ctx.getDocBase());
System.out.println(msg);
}
}
void processWebXmlFile( Context ctx, String file) {
try {
File f=new File(FileUtil.patch(file));
if( ! f.exists() ) {
ctx.log( "File not found " + f + ", using only defaults" );
return;
}
if( ctx.getDebug() > 0 ) ctx.log("Reading " + file );
XmlMapper xh=new XmlMapper();
if( validate ) {
xh.setValidating(true);
// if( ctx.getDebug() > 5 ) xh.setDebug( 3 );
}
// By using dtdURL you brake most parsers ( at least xerces )
xh.registerDTDRes("-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN",
"/org/apache/tomcat/resources/web.dtd");
xh.addRule("web-app/context-param", xh.methodSetter("addInitParameter", 2) );
xh.addRule("web-app/context-param/param-name", xh.methodParam(0) );
xh.addRule("web-app/context-param/param-value", xh.methodParam(1) );
xh.addRule("web-app/description", xh.methodSetter("setDescription", 0) );
xh.addRule("web-app/icon/small-icon", xh.methodSetter("setIcon", 0) );
xh.addRule("web-app/distributable", xh.methodSetter("setDistributable", 0) );
xh.addRule("web-app/servlet-mapping", xh.methodSetter("addServletMapping", 2) );
xh.addRule("web-app/servlet-mapping/servlet-name", xh.methodParam(1) );
xh.addRule("web-app/servlet-mapping/url-pattern", xh.methodParam(0) );
xh.addRule("web-app/taglib", xh.methodSetter("addTaglib", 2) );
xh.addRule("web-app/taglib/taglib-uri", xh.methodParam(0) );
xh.addRule("web-app/taglib/taglib-location", xh.methodParam(1) );
xh.addRule("web-app/env-entry", xh.methodSetter("addEnvEntry", 4) );
xh.addRule("web-app/env-entry/env-entry-name", xh.methodParam(0) );
xh.addRule("web-app/env-entry/env-entry-type", xh.methodParam(1) );
xh.addRule("web-app/env-entry/env-entry-value", xh.methodParam(2) );
xh.addRule("web-app/env-entry/description", xh.methodParam(3) );
xh.addRule("web-app/login-config", xh.methodSetter("setLoginConfig", 4) );
xh.addRule("web-app/login-config/auth-method", xh.methodParam(0) );
xh.addRule("web-app/login-config/realm-name", xh.methodParam(1) );
xh.addRule("web-app/login-config/form-login-config/form-login-page", xh.methodParam(2) );
xh.addRule("web-app/login-config/form-login-config/form-error-page", xh.methodParam(3) );
xh.addRule("web-app/mime-mapping", xh.methodSetter("addContentType", 2) );
xh.addRule("web-app/mime-mapping/extension", xh.methodParam(0) );
xh.addRule("web-app/mime-mapping/mime-type", xh.methodParam(1) );
xh.addRule("web-app/welcome-file-list/welcome-file", xh.methodSetter("addWelcomeFile", 0) );
xh.addRule("web-app/error-page", xh.methodSetter("addErrorPage",2) );
xh.addRule("web-app/error-page/error-code", xh.methodParam(0) );
xh.addRule("web-app/error-page/exception-type", xh.methodParam(0) );
xh.addRule("web-app/error-page/location", xh.methodParam(1) );
xh.addRule("web-app/session-config", xh.methodSetter("setSessionTimeOut", 1, new String[]{"int"}));
xh.addRule("web-app/session-config/session-timeout", xh.methodParam(0));
// Servlet
xh.addRule("web-app/servlet", xh.objectCreate("org.apache.tomcat.core.ServletWrapper") ); // servlet-wrapper
xh.addRule("web-app/servlet", xh.setParent( "setContext") ); // remove it from stack when done
xh.addRule("web-app/servlet", xh.addChild("addServlet", null) ); // remove it from stack when done
xh.addRule("web-app/servlet/servlet-name", xh.methodSetter("setServletName",0) );
xh.addRule("web-app/servlet/servlet-class", xh.methodSetter("setServletClass",0));
xh.addRule("web-app/servlet/jsp-file",xh.methodSetter("setPath",0));
xh.addRule("web-app/servlet/security-role-ref", xh.methodSetter("addSecurityMapping", 3) );
xh.addRule("web-app/servlet/security-role-ref/role-name", xh.methodParam(0) );
xh.addRule("web-app/servlet/security-role-ref/role-link", xh.methodParam(1) );
xh.addRule("web-app/servlet/security-role-ref/description", xh.methodParam(2) );
xh.addRule("web-app/servlet/init-param", xh.methodSetter("addInitParam", 2) ); // addXXX
xh.addRule("web-app/servlet/init-param/param-name", xh.methodParam(0) );
xh.addRule("web-app/servlet/init-param/param-value", xh.methodParam(1) );
xh.addRule("web-app/servlet/icon/small-icon", xh.methodSetter("setIcon",0 )); // icon, body
xh.addRule("web-app/servlet/description", xh.methodSetter("setDescription", 0) ); // description, body
xh.addRule("web-app/servlet/load-on-startup", xh.methodSetter("setLoadOnStartUp", 0 ));
addSecurity( xh );
Object ctx1=xh.readXml(f, ctx);
} catch(Exception ex ) {
System.out.println("ERROR reading " + file);
ex.printStackTrace();
// XXX we should invalidate the context and un-load it !!!
}
}
// Add security rules - complex code
void addSecurity( XmlMapper xh ) {
xh.addRule("web-app/security-constraint",
new SCAction() );
xh.addRule("web-app/security-constraint/user-data-constraint/transport-guarantee",
new XmlAction() {
public void end( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
SecurityConstraint rc=(SecurityConstraint)st.peek();
String body=ctx.getBody().trim();
rc.setTransport( body );
}
}
);
xh.addRule("web-app/security-constraint/auth-constraint/role-name",
new XmlAction() {
public void end( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
SecurityConstraint rc=(SecurityConstraint)st.peek();
String body=ctx.getBody().trim();
rc.addRole( body );
}
}
);
xh.addRule("web-app/security-constraint/web-resource-collection",
new XmlAction() {
public void start( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
st.push(new ResourceCollection());
}
public void end( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
ResourceCollection rc=(ResourceCollection)st.pop();
SecurityConstraint sc=(SecurityConstraint)st.peek();
st.push( rc );
sc.addResourceCollection( rc );
}
public void cleanup( SaxContext ctx) {
Stack st=ctx.getObjectStack();
Object o=st.pop();
}
}
);
xh.addRule("web-app/security-constraint/web-resource-collection/url-pattern",
new XmlAction() {
public void end( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
ResourceCollection rc=(ResourceCollection)st.peek();
String body=ctx.getBody().trim();
rc.addUrlPattern( body );
}
}
);
xh.addRule("web-app/security-constraint/web-resource-collection/http-method",
new XmlAction() {
public void end( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
ResourceCollection rc=(ResourceCollection)st.peek();
String body=ctx.getBody().trim();
rc.addHttpMethod( body );
}
}
);
}
}
/** Specific action for Security-constraint
*/
class SCAction extends XmlAction {
public void start( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
st.push(new SecurityConstraint());
}
public void end( SaxContext ctx) throws Exception {
Stack st=ctx.getObjectStack();
String tag=ctx.getTag(ctx.getTagCount()-1);
SecurityConstraint sc=(SecurityConstraint)st.pop();
Context context=(Context)st.peek();
st.push( sc ); // restore stack
// add all patterns that will need security
String roles[]=sc.getRoles();
String transport=sc.getTransport();
Enumeration en=sc.getResourceCollections();
while( en.hasMoreElements()) {
ResourceCollection rc=(ResourceCollection)en.nextElement();
String paths[]=rc.getPatterns();
String meths[]=rc.getMethods();
context.addSecurityConstraint( paths, meths ,
roles, transport);
}
}
public void cleanup( SaxContext ctx) {
Stack st=ctx.getObjectStack();
Object o=st.pop();
}
}
class SecurityConstraint {
Vector roles=new Vector();
String transport;
Vector resourceC=new Vector();
public SecurityConstraint() {
}
public void setTransport( String transport ) {
this.transport=transport;
}
public String getTransport() {
return this.transport;
}
public void addRole(String role ) {
roles.addElement( role );
}
public void addResourceCollection( ResourceCollection rc ) {
resourceC.addElement( rc );
}
public String []getRoles() {
String rolesA[]=new String[roles.size()];
for( int i=0; i< rolesA.length; i++ ) {
rolesA[i]=(String)roles.elementAt( i );
}
return rolesA;
}
public Enumeration getResourceCollections() {
return resourceC.elements();
}
}
class ResourceCollection {
Vector urlP=new Vector();
Vector methods=new Vector();
public ResourceCollection() {
}
public void addUrlPattern( String pattern ) {
urlP.addElement( pattern );
}
public void addHttpMethod( String method ) {
methods.addElement( method );
}
public String []getMethods() {
String methodsA[]=new String[methods.size()];
for( int i=0; i< methodsA.length; i++ ) {
methodsA[i]=(String)methods.elementAt( i );
}
return methodsA;
}
public String []getPatterns() {
String patternsA[]=new String[urlP.size()];
for( int i=0; i< patternsA.length; i++ ) {
patternsA[i]=(String)urlP.elementAt( i );
}
return patternsA;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -