Jan Krpata created MYFACES-4354:
-----------------------------------

             Summary: 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


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)

Reply via email to