Hello,

I encountered an odd situation with request dispatching.

Environment:
Java platform: Oracle 1.7 (7u9)
Tomcat platform: 7.0.32, 7.0.33
Operating systems: Linux, Windows (likely irrelevant)
Browser: Firefox 17

In short, if the same request is first redirected using servlet API
RequestDispatcher.forward(), and then via JSTL c:redirect using a
relative target, the end result seems incorrect.

So, consider a web app with /WEB-INF/web.xml as:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd";>
    <display-name>RedirT</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>


... and /sub/index.jsp as:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
RequestDispatcher rd = application.getRequestDispatcher("/");
rd.forward(request, response);
%>


... and /index.jsp as:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<c:redirect url="sub/page.jsp"/>


(sub/page.jsp contents omitted as irrelevant for now)

Then, consider a request to http://server/context/sub/index.jsp .
Looking at the above, I would expect:
- the request to be first processed by /sub/index.jsp (this happens)
- next by /index.jsp (this happens, too)
- ending with showing http://server/context/sub/page.jsp (this doesn't happen!)

Instead, the error is "The requested resource
(/RedirT/sub/sub/page.jsp) is not available.".
Note the "sub" path component being listed twice.

So, it is as if the first redirect (using the RequestDispatcher
manually, in /sub/index.jsp) fails to reset
the "current" location for the requested component from /sub to /, and
then subsequently, the c:redirect
in /index.jsp adds another "sub" to the request path.

If, on the other hand, the latter redirect is done with an address
bound to context root (i.e. /sub/page.jsp,
instead of sub/page.jsp), the request ends up in the expected place.
Also, if the first redirect is done with
<c:redirect> rather than the RequestDispatcher, the request ends up in
the expected place.

This structure looks admittedly odd, but part of that came from
producing this SSCCE; the original context
was that the initial RequestDispatcher.forward() was located inside a
filter class (but similarly, forwarded
a request targeted to a resource in a subdirectory to /index.jsp,
which in turn contains the c:redirect to
another resource within the same subdirectory. I encountered this when
moving an application from
a WebLogic 9.2 server (where this structure had worked without issues)
to a Tomcat server (where this
"not found" error appeared.

Any comments? Did I come across a but in Tomcat, or a "lucky bug" in
the application (i.e. something
that worked by luck in the previous container)? While I can (and did)
change the application so that the
c:redirect in /index.jsp now uses a context-absolute addressing, I'd
be interested in hearing the actual
verdict. I tried to read the servlet specification, but could not find
an exact description covering this case.

Thanks,
-- 
..Juha

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to