? cross_context_patch.txt ? jakarta-tomcat-catalina.iml Index: catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java,v retrieving revision 1.39 diff -u -r1.39 ApplicationDispatcher.java --- catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java 27 Jun 2004 23:56:22 -0000 1.39 +++ catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java 27 Aug 2004 01:15:42 -0000 @@ -919,8 +919,16 @@ } crossContext = !(context.getPath().equals(contextPath)); } - wrapper = new ApplicationHttpRequest - (hcurrent, context, crossContext); + if (!(outerResponse instanceof HttpServletResponse)) { + wrapper = new ApplicationHttpRequest + (hcurrent, context, crossContext); + } + else { + HttpServletResponse res = (HttpServletResponse)outerResponse; + wrapper = new ApplicationHttpRequest + (hcurrent, res, context, crossContext); + } + } else { wrapper = new ApplicationRequest(current); } Index: catalina/src/share/org/apache/catalina/core/ApplicationHttpRequest.java =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationHttpRequest.java,v retrieving revision 1.21 diff -u -r1.21 ApplicationHttpRequest.java --- catalina/src/share/org/apache/catalina/core/ApplicationHttpRequest.java 12 Mar 2004 19:45:43 -0000 1.21 +++ catalina/src/share/org/apache/catalina/core/ApplicationHttpRequest.java 27 Aug 2004 01:15:43 -0000 @@ -30,6 +30,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Context; import org.apache.catalina.Globals; @@ -82,7 +84,6 @@ // ----------------------------------------------------------- Constructors - /** * Construct a new wrapped request around the specified servlet request. * @@ -98,6 +99,24 @@ } + /** + * Construct a new wrapped request around the specified servlet request. + * + * @param request The servlet request being wrapped + */ + public ApplicationHttpRequest(HttpServletRequest request, + HttpServletResponse response, + Context context, + boolean crossContext) { + + super(request); + this.context = context; + this.crossContext = crossContext; + setRequest(request); + setResponse(response); + + } + // ----------------------------------------------------- Instance Variables @@ -188,6 +207,11 @@ */ protected Session session = null; + /** + * The associated response. Used for creating new sessions. + */ + protected HttpServletResponse response; + /** * Special attributes. @@ -473,9 +497,7 @@ * @param create Create a new session if one does not exist */ public HttpSession getSession(boolean create) { - if (crossContext) { - // There cannot be a session if no context has been assigned yet if (context == null) return (null); @@ -507,6 +529,14 @@ localSession.setMaxInactiveInterval (context.getManager().getMaxInactiveInterval()); localSession.setId(other.getId()); + + if (context.getCookies() && response != null && + !response.isCommitted()) { + Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME, + localSession.getId()); + cookie.setPath(context.getPath()); + response.addCookie(cookie); + } } localSession.access(); session = localSession; @@ -621,6 +651,10 @@ requestURI = request.getRequestURI(); servletPath = request.getServletPath(); + } + + void setResponse(HttpServletResponse response) { + this.response = response; }