📄 context.java
字号:
}
if( name.equals( "org.apache.tomcat.protection_domain") ) {
return getProtectionDomain();
}
if(name.equals("org.apache.tomcat.classloader")) {
return this.getServletLoader().getClassLoader();
}
if( name.equals(FacadeManager.FACADE_ATTRIBUTE)) {
if( ! allowAttribute(name) ) return null;
return this.getFacadeManager();
}
return null; // org.apache.tomcat namespace is reserved in tomcat
} else {
Object o = attributes.get(name);
return attributes.get(name);
}
}
public Enumeration getAttributeNames() {
return attributes.keys();
}
public void setAttribute(String name, Object object) {
attributes.put(name, object);
}
public void removeAttribute(String name) {
attributes.remove(name);
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
public void setIcon( String icon ) {
}
public boolean isDistributable() {
return this.isDistributable;
}
public void setDistributable(boolean isDistributable) {
this.isDistributable = isDistributable;
}
public void setDistributable(String s) {
// XXX
}
public int getSessionTimeOut() {
return this.sessionTimeOut;
}
public void setSessionTimeOut(int sessionTimeOut) {
this.sessionTimeOut = sessionTimeOut;
}
public FileNameMap getMimeMap() {
return mimeTypes;
}
public void addContentType( String ext, String type) {
mimeTypes.addContentType( ext, type );
}
public String getErrorPage(int errorCode) {
return getErrorPage(String.valueOf(errorCode));
}
public void addErrorPage( String errorType, String value ) {
this.errorPages.put( errorType, value );
}
public String getErrorPage(String errorCode) {
return (String)errorPages.get(errorCode);
}
/** Authentication method, if any specified
*/
public String getAuthMethod() {
return authMethod;
}
/** Realm to be used
*/
public String getRealmName() {
return realmName;
}
public String getFormLoginPage() {
return formLoginPage;
}
public String getFormErrorPage() {
return formErrorPage;
}
public void setFormLoginPage( String page ) {
formLoginPage=page;
}
public void setFormErrorPage( String page ) {
formErrorPage=page;
}
public void setLoginConfig( String authMethod, String realmName,
String formLoginPage, String formErrorPage)
{
// System.out.println("Login config: " + authMethod + " " + realmName + " " +
// formLoginPage + " " + formErrorPage);
this.authMethod=authMethod;
this.realmName=realmName;
this.formLoginPage=formLoginPage;
this.formErrorPage=formErrorPage;
}
// -------------------- Mappings --------------------
/**
* Maps a named servlet to a particular path or extension.
* If the named servlet is unregistered, it will be added
* and subsequently mapped.
*
* Note that the order of resolution to handle a request is:
*
* exact mapped servlet (eg /catalog)
* prefix mapped servlets (eg /foo/bar/*)
* extension mapped servlets (eg *jsp)
* default servlet
*
*/
public void addServletMapping(String path, String servletName)
throws TomcatException
{
if( mappings.get( path )!= null) {
log( "Removing duplicate " + path + " -> " + mappings.get(path) );
mappings.remove( path );
Container ct=(Container)containers.get( path );
removeContainer( ct );
}
ServletWrapper sw = (ServletWrapper)servlets.get(servletName);
if (sw == null) {
// Workaround for frequent "bug" in web.xmls
// Declare a default mapping
log("Mapping with unregistered servlet " + servletName );
sw = addServlet( servletName, servletName );
}
if( "/".equals(path) )
defaultServlet = sw;
mappings.put( path, sw );
Container map=new Container();
map.setContext( this );
map.setHandler( sw );
map.setPath( path );
contextM.addContainer( map );
containers.put( path, map );
}
/** Will add a new security constraint:
For all paths:
if( match(path) && match(method) && match( transport ) )
then require("roles")
This is equivalent with adding a Container with the path,
method and transport. If the container will be matched,
the request will have to pass the security constraints.
*/
public void addSecurityConstraint( String path[], String methods[],
String roles[], String transport)
throws TomcatException
{
for( int i=0; i< path.length; i++ ) {
Container ct=new Container();
ct.setContext( this );
ct.setTransport( transport );
ct.setRoles( roles );
ct.setPath( path[i] );
ct.setMethods( methods );
// XXX check if exists, merge if true.
constraints.put( path[i], ct );
//contextM.addSecurityConstraint( this, path[i], ct);
contextM.addContainer( ct );
}
}
public Enumeration getContainers() {
return containers.elements();
}
public Enumeration getContainerLocations() {
return containers.keys();
}
public Container getContainer( String path ) {
return (Container)containers.get(path);
}
// return the container associated with this context -
// which is also the default container
public Container getContainer() {
return defaultContainer;
}
public void removeContainer( Container ct ) {
containers.remove(ct.getPath());
}
// public ServletWrapper getDefaultServlet() {
// if( defaultServlet==null)
// defaultServlet=getServletByName(Constants.DEFAULT_SERVLET_NAME );
// return defaultServlet;
// }
// -------------------- Servlets management --------------------
// XXX do we need that ??
/** Remove the servlet with a specific name
*/
public void removeServletByName(String servletName)
throws TomcatException
{
servlets.remove( servletName );
}
public ServletWrapper getServletByName(String servletName) {
return (ServletWrapper)servlets.get(servletName);
}
/**
* Add a servlet with the given name to the container. The
* servlet will be loaded by the container's class loader
* and instantiated using the given class name.
*
* Called to add a new servlet from web.xml
*/
public void addServlet(ServletWrapper wrapper)
throws TomcatException
{
wrapper.setContext( this );
String name=wrapper.getServletName();
// System.out.println("Adding servlet " + name + " " + wrapper);
// check for duplicates
if (servlets.get(name) != null) {
log("Removing duplicate servlet " + name + " " + wrapper);
removeServletByName(name);
// getServletByName(name).destroy();
}
servlets.put(name, wrapper);
}
public ServletWrapper addServlet(String name, String classN)
throws TomcatException
{
ServletWrapper sw = new ServletWrapper();
sw.setContext(this);
sw.setServletName(name);
if ( classN.startsWith("/")) {
sw.setPath(classN);
} else {
sw.setServletClass(classN);
}
addServlet( sw );
return sw;
}
public Enumeration getServletNames() {
return servlets.keys();
}
// -------------------- Loading and sessions --------------------
public void setServletLoader(ServletLoader loader ) {
this.servletL=loader;
}
public ServletLoader getServletLoader() {
return servletL;
}
/* -------------------- Utils -------------------- */
public void setDebug( int level ) {
if(level>0) log( "Set debug to " + level );
debug=level;
}
public void setDebug( String level ) {
try {
setDebug( Integer.parseInt(level) );
} catch (Exception e) {
log("Trying to set debug to '" + level + "':", e, Logger.ERROR);
}
}
public int getDebug( ) {
return debug;
}
// ------------------- Logging ---------------
LogHelper loghelper = new LogHelper("tc_log", this);
LogHelper loghelperServlet = new LogHelper("servlet_log", null);
/** Internal log method
*/
public final void log(String msg) {
loghelper.log(msg);
}
/** Internal log method
*/
public void log(String msg, Throwable t) {
loghelper.log(msg, t);
}
/** Internal log method
*/
public void log(String msg, Throwable t, int level) {
loghelper.log(msg, t, level);
}
/** User-level log method ( called from a servlet)
*/
public void logServlet( String msg , Throwable t ) {
msg = ("path=\"" + path + "\" :" + msg);
loghelperServlet.log(msg, t);
}
public String toString() {
return "Ctx( " + (vhost==null ? "" : vhost + ":" ) + path + " )";
}
// -------------------- Facade methods --------------------
public Context getContext(String path) {
if (! path.startsWith("/")) {
return null; // according to spec, null is returned
// if we can't return a servlet, so it's more probable
// servlets will check for null than IllegalArgument
}
// Return null if cross context lookups are not allowed
if (!crossContext)
return null;
// absolute path
Request lr=contextM.createRequest( path );
if( vhost != null ) lr.setServerName( vhost );
getContextManager().processRequest(lr);
return lr.getContext();
}
/** Implements getResource()
* See getRealPath(), it have to be local to the current Context -
* and can't go to a sub-context. That means we don't need any overhead.
*/
public URL getResource(String rpath) throws MalformedURLException {
if (rpath == null) return null;
if(URLUtil.hasEscape(rpath))
return null;
URL url = null;
String absPath=getAbsolutePath();
if ("".equals(rpath))
return new URL( "file", null, 0, absPath );
if ( ! rpath.startsWith("/"))
rpath="/" + rpath;
String realPath=FileUtil.safePath( absPath, rpath);
if( realPath==null ) {
log( "Unsafe path " + absPath + " " + rpath );
return null;
}
try {
url=new URL("file", null, 0,realPath );
if( debug>9) log( "getResourceURL=" + url + " request=" + rpath );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -