You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by William Maurer <ma...@dsplabs.com> on 2001/04/03 06:21:52 UTC

URL rewriting ignored for "/whatever" context path; broken for "/" context path

Hi,
	I'm using Tomcat 3.2.1, and after searching the archives it appears URL
	rewriting is working OK. I must be doing something to mess
	things up. Thanks in advance for your help.

Bill

	My com.xxx.MyServlet servlet executes the following 3
	lines of code as the last step in processing each request in
	"doPost":

	1. String encodedNextURL = httpServletResponse.encodeURL(this.nextURL);
	2. RequestDispatcher rd = this.getServletContext().getRequestDispatcher(encodedNextURL);
	3. rd.forward(httpServletRequest, httpServletResponse);

	When my servlet's context path is "/whatever", then
	encodedNextURL is always the same as this.nextURL after line 1
	is executed. 
	
	Why?

	The following happens in HttpServletResponseFacade.java for
	this.nextURL=/ShoppingStep.jsp 

	toAbsolute(/ShoppingStep.jsp) returns
	http://localhost:8080/ShoppingStep.jsp 

	isEncodeable(http://localhost:8080/ShoppingStep.jsp) always
	returns false at lines 363-368 because
	!file.startsWith(contextPath) is true.

	Stopped at line 366 in HttpServletResponseFacade.java
	Thread-103[1] locals
	Method arguments:
	this = org.apache.tomcat.facade.HttpServletResponseFacade@80e6674
	location = http://localhost:8080/ShoppingStep.jsp
	Local variables:
	request = R( /whatever + /servlet/com.xxx.MyServlet + null)
	url = http://localhost:8080/ShoppingStep.jsp
	urlPort = 8080
	contextPath = /whatever
	file = /ShoppingStep.jsp

	String contextPath = request.getContext().getPath();
	if ((contextPath != null) && (contextPath.length() > 0)) {
	    String file = url.getFile();
	    if ((file == null) || !file.startsWith(contextPath))
		return (false);
	}

	encodedNextURL gets assigned /ShoppingStep.jsp
  
	When my servlet's context path is "/", then
	this.nextURL get's rewritten and
	encodedNextURL gets assigned
	/ShoppingStep.jsp;jsessionid=2nrrjkjci1 but 

	
	Forwarding the URL (see line 3 above)
	"/ShoppingStep.jsp;jsessionid=2nrrjkjci1" 
	results in a "The document contains no data" message being
	displayed by the browser. It appears the jsessionid is the
	problem per StaticInterceptor.java lines 199-212, because
	file is not a file or a directory as a result of jessionid
	hanging off the end of the path.  

Thread-102[1] locals
Method arguments:
  this = org.apache.tomcat.request.StaticInterceptor@80f0ddb
  req = R(  + /ShoppingStep.jsp;jsessionid=lo3hbfjvp1 + null)
Local variables:
  pathInfo = /ShoppingStep.jsp;jsessionid=lo3hbfjvp1
  ctx = Ctx(  )
  absPath = /home/maurer/ejpos/unix/local/jakarta-tomcat/webapps/ROOT/ShoppingStep.jsp;jsessionid=lo3hbfjvp1
  requestURI = /ShoppingStep.jsp;jsessionid=lo3hbfjvp1
  file = /home/maurer/ejpos/unix/local/jakarta-tomcat/webapps/ROOT/ShoppingStep.jsp;jsessionid=lo3hbfjvp1
  welcomeFile is not in scope
  redirectURI is not in scope



	File file=new File( absPath );

	if( file.isFile() ) {
	    if( debug > 0 ) log( "Setting handler to file " + absPath);
	    req.setNote( realFileNote, absPath );
	    req.setWrapper(  ctx.getServletByName( "tomcat.fileHandler"));
	    return 0;
	}

	if( ! file.isDirectory() ) {
	    // we support only files and dirs
	    if( debug > 0) log( "No file and no directory");
	    return 0; // no handler is set - will end up as 404
	}