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

2021-02-05 Thread Thomas Andraschko
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 :

> 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: devn...@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
>


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

2021-02-05 Thread DevNews
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: devn...@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