You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by DevNews <De...@safir-wid.de> on 2021/02/05 14:07:34 UTC

using DeltaSpike and JSF2.2 ExternalContext.redirect results in two requests

Hallo,

in our web-application (JSF2.2 with DaltaSpike) we listen in a PhaseListener during RESTORE_VIEW on a special url. According to the HTTP-Post data we initialize a ViewAccessScoped bean and then redirect to a target url using ExternalContext.redirect(targeturl).

This redirect results in two requests to the target url. Both requests have different instances of the ViewAccessScoped bean. For this reason the initialization data gets lost.


How can a redirect be done without having two following requests?


Before migrating from JSF1.2 to JSF2.2 and without using DeltaSpike there was only one request after redirecting. Threrefore we suppose that this effect results from deltaspike and the dswid parameter.
For this reason we tried to extend the target url like:
            targeturl + „?dswid=“ + viewaccesscopedbean.getDswid()
reading the dswid from deltaspike – WindowContext

With this extension of the targeturl the behaviour is no more predictable. The redirect sometimes results in two sometimes it results in one request.


Here our java-code:


public class MyTestPhaseListener implements PhaseListener
{
/**
* ViewAccessScoped Bean
*/
    @Inject
    MyVAccBean myVAccBean;

    @Override
    public void afterPhase(PhaseEvent event)
    {
    }

    @Override
    public void beforePhase(PhaseEvent event)
    {
if (event.getPhaseId() == PhaseId.RESTORE_VIEW)
{
    ExternalContext extCtx = event.getFacesContext().getExternalContext();
    HttpServletRequest request = (HttpServletRequest) extCtx.getRequest();
    String currReqUri = request.getRequestURI();
    if (currReqUri.indexOf("/initialPage.jsf") > 0)
    {
myVAccBean.setValue("some value");
redirectToTargetUrl(event, "targetPage.jsf");
    }
}
    }

    private void redirectToTargetUrl(PhaseEvent event, String tagretUrl)
    {
try
{
    String encodedUrl = tagretUrl + "?dswid=" + myVAccBean.geDsWindowId();
    event.getFacesContext().getExternalContext().redirect(encodedUrl);
}
catch (Throwable e)
{
    e.printStackTrace();
}
    }

    @Override
    public PhaseId getPhaseId()
    {
return PhaseId.ANY_PHASE;
    }
}



Tel:
E-Mail: DevNews@safir-wid.de
Internet: https://www.safir-wid.de

safir Wirtschaftsinformationsdienst GmbH
Sitz der Gesellschaft: Möllendorffstr.49, 10367 Berlin
Geschäftsführer: Thilo Kind
Registergericht: Amtsgericht Berlin Charlottenburg, HRB 66681
USt-ID: DE 193584747




-- 
This email was Malware checked by UTM 9. http://www.sophos.com

Re: using DeltaSpike and JSF2.2 ExternalContext.redirect results in two requests

Posted by Thomas Andraschko <an...@gmail.com>.
In general DeltaSpike needs to verify, depending on the ClientWindowMode,
if the windowId is valid and sends a redirect.

Please come back if you know exactly where the redirect will be triggered -
AND - check the DS docs.

Am Fr., 5. Feb. 2021 um 15:07 Uhr schrieb DevNews <De...@safir-wid.de>:

> Hallo,
>
> in our web-application (JSF2.2 with DaltaSpike) we listen in a
> PhaseListener during RESTORE_VIEW on a special url. According to the
> HTTP-Post data we initialize a ViewAccessScoped bean and then redirect to a
> target url using ExternalContext.redirect(targeturl).
>
> This redirect results in two requests to the target url. Both requests
> have different instances of the ViewAccessScoped bean. For this reason the
> initialization data gets lost.
>
>
> How can a redirect be done without having two following requests?
>
>
> Before migrating from JSF1.2 to JSF2.2 and without using DeltaSpike there
> was only one request after redirecting. Threrefore we suppose that this
> effect results from deltaspike and the dswid parameter.
> For this reason we tried to extend the target url like:
>             targeturl + „?dswid=“ + viewaccesscopedbean.getDswid()
> reading the dswid from deltaspike – WindowContext
>
> With this extension of the targeturl the behaviour is no more predictable.
> The redirect sometimes results in two sometimes it results in one request.
>
>
> Here our java-code:
>
>
> public class MyTestPhaseListener implements PhaseListener
> {
> /**
> * ViewAccessScoped Bean
> */
>     @Inject
>     MyVAccBean myVAccBean;
>
>     @Override
>     public void afterPhase(PhaseEvent event)
>     {
>     }
>
>     @Override
>     public void beforePhase(PhaseEvent event)
>     {
> if (event.getPhaseId() == PhaseId.RESTORE_VIEW)
> {
>     ExternalContext extCtx = event.getFacesContext().getExternalContext();
>     HttpServletRequest request = (HttpServletRequest) extCtx.getRequest();
>     String currReqUri = request.getRequestURI();
>     if (currReqUri.indexOf("/initialPage.jsf") > 0)
>     {
> myVAccBean.setValue("some value");
> redirectToTargetUrl(event, "targetPage.jsf");
>     }
> }
>     }
>
>     private void redirectToTargetUrl(PhaseEvent event, String tagretUrl)
>     {
> try
> {
>     String encodedUrl = tagretUrl + "?dswid=" + myVAccBean.geDsWindowId();
>     event.getFacesContext().getExternalContext().redirect(encodedUrl);
> }
> catch (Throwable e)
> {
>     e.printStackTrace();
> }
>     }
>
>     @Override
>     public PhaseId getPhaseId()
>     {
> return PhaseId.ANY_PHASE;
>     }
> }
>
>
>
> Tel:
> E-Mail: DevNews@safir-wid.de
> Internet: https://www.safir-wid.de
>
> safir Wirtschaftsinformationsdienst GmbH
> Sitz der Gesellschaft: Möllendorffstr.49, 10367 Berlin
> Geschäftsführer: Thilo Kind
> Registergericht: Amtsgericht Berlin Charlottenburg, HRB 66681
> USt-ID: DE 193584747
>
>
>
>
> --
> This email was Malware checked by UTM 9. http://www.sophos.com
>