|
What this is
Other links
The source code
/*
* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed 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.tomcat.facade;
import java.util.Enumeration;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.apache.tomcat.core.BaseInterceptor;
import org.apache.tomcat.core.Container;
import org.apache.tomcat.core.Context;
import org.apache.tomcat.core.ContextManager;
import org.apache.tomcat.core.Handler;
import org.apache.tomcat.core.Request;
import org.apache.tomcat.core.Response;
import org.apache.tomcat.core.ServerSession;
import org.apache.tomcat.core.TomcatException;
import org.apache.tomcat.util.collections.SimplePool;
import org.apache.tomcat.util.compat.Jdk11Compat;
/**
* Control class for facades - this is the only "gate" between servlets
* and tomcat.
*
* This is an important security component, shouldn't be used for
* anything else. Please keep all the code short and clean - and review
* everything very often.
*
*/
public final class Servlet22Interceptor
extends BaseInterceptor
{
public static final String SERVLET_STAMP = " ( JSP 1.1; Servlet 2.2 )";
private int stmPoolSize = SimplePool.DEFAULT_SIZE;
private boolean useStmPool = true;
public Servlet22Interceptor() {
}
public Servlet22Interceptor(Context ctx) {
}
public void setSTMPoolSize(int size) {
stmPoolSize = size;
}
public void setUseSTMPool(boolean use) {
useStmPool = use;
}
// -------------------- implementation
private void setEngineHeader(Context ctx) {
String engineHeader=ctx.getEngineHeader();
// EngineHeader can be set as a Context Property!
if( engineHeader==null) {
StringBuffer sb=new StringBuffer();
sb.append(ContextManager.TOMCAT_NAME);
sb.append("/");
sb.append(ContextManager.TOMCAT_VERSION );
sb.append(SERVLET_STAMP);
engineHeader=sb.toString();
}
ctx.setEngineHeader( engineHeader );
}
/** Call servlet.destroy() for all servlets, as required
by the spec
*/
public void contextShutdown( Context ctx )
throws TomcatException
{
// shut down and servlets
Enumeration enum = ctx.getServletNames();
while (enum.hasMoreElements()) {
String key = (String)enum.nextElement();
Handler wrapper = ctx.getServletByName( key );
if( ! (wrapper instanceof ServletHandler) )
continue;
try {
((ServletHandler)wrapper).destroy();
} catch(Exception ex ) {
ctx.log( "Error in destroy ", ex);
}
// remove the context after it is destroyed.
// remove will "un-declare" the servlet
// After this the servlet will be in STATE_NEW, and can
// be reused.
ctx.removeServletByName( key );
}
}
public void addContext( ContextManager cm, Context ctx )
throws TomcatException
{
ctx.setFacade(new ServletContextFacade(cm , ctx));
setEngineHeader( ctx );
}
public void addContainer( Container ct )
throws TomcatException
{
String hN=ct.getHandlerName();
if( hN == null ) return;
if( ct.getHandler() == null ) {
// we have a container with a valid handler name but without
// a Handler. Create a ServletWrapper
ServletHandler handler=new ServletHandler();
handler.setServletClassName( hN );
handler.setName( hN );
handler.setContext( ct.getContext() );
// *.jsp -> jsp is a legacy default mapping
if(debug>0 && ! "jsp".equals(hN) ) {
log( "Create handler " + hN);
}
handler.setModule( this );
ct.setHandler(handler);
ct.getContext().addServlet( handler );
}
if(ct.getHandler() instanceof ServletHandler) {
ServletHandler handler = (ServletHandler)ct.getHandler();
handler.setSTMPoolSize(stmPoolSize);
handler.setUseSTMPool(useStmPool);
}
}
static Jdk11Compat jdk11Compat = Jdk11Compat.getJdkCompat();
/** Call the Servlet22 callbacks when session expires.
*/
public int sessionState( Request req, ServerSession sess, int newState)
{
if( debug > 0 )
log("sessionState " + sess.getId() + " " + newState + " " + sess.getState());
if( newState==ServerSession.STATE_SUSPEND ||
newState==ServerSession.STATE_EXPIRED ) {
if( debug > 0 )
log("Unbinding variables ");
// generate "unbould" events when the session is suspended or
// expired
HttpSession httpSess=(HttpSession)sess.getFacade();
Vector removed=null; // lazy
Enumeration e = sess.getAttributeNames();
ClassLoader clSave = jdk11Compat.getContextClassLoader();
ClassLoader cxCL = sess.getContext().getClassLoader();
if( clSave != cxCL ) {
jdk11Compat.setContextClassLoader(cxCL);
} else {
clSave = null;
}
// announce all values with listener that we'll remove them
while( e.hasMoreElements() ) {
String key = (String) e.nextElement();
Object value = sess.getAttribute(key);
if( value instanceof HttpSessionBindingListener) {
if( debug > 0 )
log("valueUnbound " + sess.getId() + " " + key );
try {
((HttpSessionBindingListener) value).valueUnbound
(new HttpSessionBindingEvent(httpSess , key));
} catch ( Throwable th ) {
log("Exception during unbound", th );
}
if( removed==null) removed=new Vector();
removed.addElement( key );
}
}
if( clSave != null ) {
jdk11Compat.setContextClassLoader(clSave);
}
if( removed!=null ) {
// remove
e=removed.elements();
while( e.hasMoreElements() ) {
String key = (String) e.nextElement();
sess.removeAttribute( key );
}
}
if( httpSess != null && newState==ServerSession.STATE_EXPIRED ) {
((HttpSessionFacade)httpSess).recycle();
}
}
return 0;
}
public int postRequest(Request rreq, Response rres ) {
//if( rreq.getContext() != ctx ) return; // throw
// log( "Recycling " + rreq );
HttpServletRequest req=(HttpServletRequest)rreq.getFacade();
if( ! (req instanceof HttpServletRequestFacade))
return 0;
((HttpServletRequestFacade)req).recycle();
// recycle response
// Response rres=rreq.getResponse();
if( rres== null )
return 0;
HttpServletResponse res=(HttpServletResponse)rres.getFacade();
if( res!=null) ((HttpServletResponseFacade)res).recycle();
// recycle output stream
// XXX XXX implement it
return 0;
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.