You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Thomas Andraschko (Jira)" <de...@myfaces.apache.org> on 2020/07/16 10:29:00 UTC
[jira] [Comment Edited] (MYFACES-4354) ExternalContext#redirect is
not add the windowId to url params.
[ https://issues.apache.org/jira/browse/MYFACES-4354?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17159097#comment-17159097 ]
Thomas Andraschko edited comment on MYFACES-4354 at 7/16/20, 10:28 AM:
-----------------------------------------------------------------------
i dont think so. Also Mojarra doesn't append it, so i think its not in the specs.
Its only appended if you use the NavigationHandler, to navigate to another JSF view.
was (Author: tandraschko):
i dont think so. Also Mojarra doesn't append it, so i think its not in the specs.
> ExternalContext#redirect is not add the windowId to url params.
> ---------------------------------------------------------------
>
> Key: MYFACES-4354
> URL: https://issues.apache.org/jira/browse/MYFACES-4354
> Project: MyFaces Core
> Issue Type: Bug
> Components: JSR-372
> Affects Versions: 2.3-next-M3
> Environment: MyFaces 2.3-next-M3
> PrimeFaces 9.0-SNAPSHOT (local install from https://github.com/primefaces/primefaces)
> Reporter: Jan Krpata
> Priority: Major
>
> When I navigate to another view from standard navigation, windowId is a part of url.
>
> {code:java}
> action="/AnotherView.xhtml"{code}
>
> URL contains windowId {{...AnotherView.xhtml?jfwid=XXXX}}
>
> But when i redirect from code like this
>
> {code:java}
> String requestContextPath = facesContext.getExternalContext().getRequestContextPath();
> facesContext.getExternalContext().redirect(requestContextPath + "/myTarget");
> {code}
> in my HttpServlet request does not contain a windowId parameter.
>
> {code:java}
> @WebServlet(name = "MyServlet", urlPatterns = { "/myTarget" })
> public class MyServlet extends HttpServlet {
> @Override
> public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
> final String windowId = request.getParameter(ConversationConsts.WINDOW_ID_PARAM); // null
> //
> }
> {code}
>
>
>
> The ExternalContext#redirect method should add jfwid parameter to the url if the URL does not already contain jfwid parameter.
> This patch works for me.
>
> {code:java}
> public void redirect(String url) throws IOException
> {
> FacesContext facesContext = getCurrentFacesContext();
> PartialViewContext partialViewContext = facesContext.getPartialViewContext();
> if (partialViewContext.isPartialRequest())
> {
> PartialResponseWriter writer = partialViewContext.getPartialResponseWriter();
> this.setResponseContentType("text/xml");
> this.setResponseCharacterEncoding("UTF-8");
> this.addResponseHeader("Cache-control", "no-cache");
> writer.startDocument();
> writer.redirect(url);
> writer.endDocument();
> facesContext.responseComplete();
> }
> else if (_servletResponse instanceof HttpServletResponse)
> {
> ExternalContext externalContext = facesContext.getExternalContext();
> Map<String, String> requestParameterMap = externalContext.getRequestParameterMap();
> String windowId = requestParameterMap.get(ResponseStateManager.CLIENT_WINDOW_URL_PARAM);
> if (windowId != null)
> {
> url = addWindowIdIfNecessary(url, windowId);
> }
> ((HttpServletResponse) _servletResponse).sendRedirect(url);
> facesContext.responseComplete();
> }
> else
> {
> throw new IllegalArgumentException("Only HttpServletResponse supported");
> }
> }
> private String addWindowIdIfNecessary(String url, String windowId)
> {
> if(url.contains(ResponseStateManager.CLIENT_WINDOW_URL_PARAM + "="))
> {
> return url;
> }
>
> StringBuilder newUrl = new StringBuilder(url);
> if(url.contains("?"))
> {
> newUrl.append("&");
> }
> else
> {
> newUrl.append("?");
> }
> newUrl.append(ResponseStateManager.CLIENT_WINDOW_URL_PARAM);
> newUrl.append("=");
> newUrl.append(windowId);
> return newUrl.toString();
> }
> {code}
>
>
>
> My settings:
> {code:java}
> <factory>
> <lifecycle-factory>org.primefaces.clientwindow.PrimeClientWindowLifecycleFactory</lifecycle-factory>
> </factory>
> {code}
> {code:java}
> <context-param>
> <param-name>javax.faces.CLIENT_WINDOW_MODE</param-name>
> <param-value>url</param-value>
> </context-param>
> {code}
> MyFaces 2.3-next-M3
> PrimeFaces 9.0-SNAPSHOT (local install from https://github.com/primefaces/primefaces)
--
This message was sent by Atlassian Jira
(v8.3.4#803005)