[ https://issues.apache.org/jira/browse/MYFACES-4354?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17159862#comment-17159862 ]
Jan Krpata commented on MYFACES-4354: ------------------------------------- Thank you for your advice. > 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: Wish > 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)