RequestDispatcher path query string parameter handling too limited and broken
with nested dispatches
----------------------------------------------------------------------------------------------------
Key: PLUTO-530
URL: https://issues.apache.org/jira/browse/PLUTO-530
Project: Pluto
Issue Type: Bug
Components: portlet container
Affects Versions: 2.0.0
Reporter: Ate Douma
Assignee: Ate Douma
Priority: Critical
Fix For: 2.0.0
Below copied (in part) from email discussion on the Pluto dev list, see also:
http://www.nabble.com/More-required-Pluto-2.0-SPI-and-implementation-refactoring-issues-td21973310.html
*** RequestDispatcher path query string parameter handling
PLT.19.4.1 specifies that "The request dispatching mechanism is responsible for
aggregating query string parameters when forwarding or
including requests".
This requirement has been implemented very literally in Pluto: a
PortletRequestDispatcher path query string is "stored" in the request instance
and on subsequent access to the parameter map from within the invoked servlet
parsed and merged on top of the portlet parametermap.
This "manual" processing and merging of query string parameters however breaks
the Servlet spec requirements!
It goes wrong if from within the dispatched servlet a subsequent dispatch is
performed with additional query string parameters.
In the current solution, this possible usage hasn't been taken into account,
with as result you'll *always* receive the same
parametermap on subsequent (nested) dispatches (for example from within a JSP
including another JSP).
But, even if the servletrequest.getRequestDispatcher(path) would be overridden
to "fix" this problem, that still won't solve it for two reasons:
- ServletContext.getRequestDispatcher(path) *cannot* be overridden, therefore
still leaving a "hole" in the solution
- there is no "returned from dispatch" callback mechanism to "revert" the
current parametermap after a dispatch
Therefore, "manual" parsing and merging of dispatcher query string parameters
*cannot* be used to implement this spec requirement.
However, the correct way to implement this is actually extremely simple: just
let the servlet container handle it all by itself!
There is no need to "store", parse and merge dispatcher query string
parameters, and in the servletrequest(wrapper).getParameterMap(), just return
super.getParameterMap() which the container will have "injected" with the
additional query string parameters merged already.
Jetspeed-2 has used this solution from the beginning (with some additional
fancy cache handling) and it just works as expected.
Changing to this solution will dramatically simplify the current
implementation, especially after the PortletRequest and ServletRequest
implementations are split up (see: PLUTO-529).
(side note: I actually wrote a testcase for this and this spec requirement is
broken in most other open-source portlet containers as well!)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.