📄 standardsessioninterceptor.java
字号:
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.tomcat.session;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import org.apache.tomcat.util.*;
import org.apache.tomcat.core.*;
/**
* This is the adapter between tomcat and a StandardManager.
* A session manager should not depend on tomcat internals - so you can
* use it in other engines and back. All you need to do is
* create an adapter ( tomcat Interceptor).
*
* You can even have multiple session managers per context - the first that
* recognize the "requestedSessionId" will create it's own HttpSession object.
* By using standard tomcat interceptor mechanisms you can plug in one or
* many session managers per context or context manager ( or even per
* URL - but that's not standard API feature ).
*
* It must be inserted after SessionInterceptor, which does common
* session stuff ( cookie, rewrite, etc)
*
* @author costin@eng.sun.com
* @author hans@gefionsoftware.com (fixed it so that URL session ID is used)
* @author Shai Fultheim [shai@brm.com]
*/
public final class StandardSessionInterceptor extends BaseInterceptor {
int manager_note;
static final char SESSIONID_ROUTE_SEP = '.';
public StandardSessionInterceptor() {
}
// -------------------- Internal methods --------------------
private StandardManager getManager( Context ctx ) {
return (StandardManager)ctx.getContainer().getNote(manager_note);
}
private void setManager( Context ctx, StandardManager sm ) {
ctx.getContainer().setNote( manager_note, sm );
}
// -------------------- Tomcat request events --------------------
public void engineInit( ContextManager cm ) throws TomcatException {
// set-up a per/container note for StandardManager
manager_note = cm.getNoteId( ContextManager.CONTAINER_NOTE, "tomcat.standardManager");
}
/**
* StandardManager will set the HttpSession if one is found.
*
*/
public int requestMap(Request request ) {
String sessionId = null;
HttpSession sess = null;
Context ctx=request.getContext();
StandardManager sM = getManager( ctx );
if( ctx==null ) {
log( "Configuration error in StandardSessionInterceptor - no context " + request );
}
// Added by Hans:
// First check if we have a valid session ID from the URL, set by the SessionInterceptor,
// and if so, set it as the request session. If we have also received a valid session ID
// as a cookie, the next section of code will reset the session to the one matching the
// ID found in the cookie.
String requestedSessionID = request.getRequestedSessionId();
if (requestedSessionID != null) {
if (debug > 0)
log("Found URL session ID: " + requestedSessionID);
sess = sM.findSession(requestedSessionID);
if (sess != null) {
if (debug > 0) log("The URL session ID is valid");
request.setSession(sess);
}
}
// PF, loop across all cookies named JSESSIONID checking to see if any of them are valid.
// There should in most cases be a maximum of 2, and normally there will only be one. The
// first valid session cookie is set as the session ID in the request.
int count=request.getCookieCount();
for( int i=0; i<count; i++ ) {
Cookie cookie = request.getCookie(i);
if (cookie.getName().equals("JSESSIONID")) {
sessionId = cookie.getValue();
if (debug > 0) log("Found session id cookie " + sessionId);
request.setRequestedSessionId( sessionId );
request.setSessionIdSource( Request.SESSIONID_FROM_COOKIE );
sess = sM.findSession(sessionId);
if (sess != null)
request.setSession(sess);
break;
}
}
return 0;
}
public void reload( Request req, Context ctx ) {
ClassLoader newLoader = ctx.getServletLoader().getClassLoader();
StandardManager sM = getManager( ctx );
sM.handleReload(req, newLoader);
}
public int newSessionRequest( Request request, Response response) {
Context ctx=request.getContext();
if( ctx==null ) return 0;
StandardManager sM = getManager( ctx );
if( request.getSession( false ) != null )
return 0; // somebody already set the session
HttpSession newS=sM.getNewSession(request.getJvmRoute());
request.setSession( newS );
return 0;
}
/** Called after request - we need to release the session object.
* This is used to prevent removal of session objects during execution,
* and may be used by interceptors that want to limit or count the
* sessions.
*/
public int postService( Request rrequest, Response response ) {
Context ctx=rrequest.getContext();
if( ctx==null ) return 0;
StandardManager sm= getManager( ctx );
HttpSession sess=rrequest.getSession(false);
if( sess == null ) return 0;
sm.release( sess );
return 0;
}
//-------------------- Tomcat context events --------------------
/** Init session management stuff for this context.
*/
public void contextInit(Context ctx) throws TomcatException {
// Defaults !!
StandardManager sm= getManager( ctx );
if( sm == null ) {
sm=new StandardManager();
setManager(ctx, sm);
}
// init is called after all context properties are set.
sm.setSessionTimeOut( ctx.getSessionTimeOut() );
sm.setDistributable( ctx.isDistributable() );
try {
sm.start();
} catch(IllegalStateException ex ) {
throw new TomcatException( ex );
}
}
/** Notification of context shutdown.
* We should clean up any resources that are used by our
* session management code.
*/
public void contextShutdown( Context ctx )
throws TomcatException
{
if( ctx.getDebug() > 0 ) ctx.log("Removing sessions from " + ctx );
StandardManager sm=getManager(ctx);
try {
if( sm != null )
sm.stop();
} catch(IllegalStateException ex ) {
throw new TomcatException( ex );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -