Mam problem z zaimplementowaniem prostego przekierowania HTTP.Liferay Portlet i JSF: Przekierowanie podczas fazy renderowania
używam Liferay 6.0.6, nasze portletów budowane są z JSF2.0/PortletFaces.
Chcę wywołać przekierowanie po załadowaniu widoku (a nie po wywołaniu działania). Obecnie moja funkcja jest wywoływana przez detektor PreRenderView.
<f:metadata>
<f:event listener="#{myControler.dispatch}" type="preRenderView" />
</f:metadata>
W tej funkcji można sprawdzić uprawnienia, robić inne rzeczy, a w niektórych przypadkach Chcę przekierować użytkownika do nowej strony (nie inny widok).
Próbowałem kilku metod, bez powodzenia. Konkretnie, myślałem, że ta metoda będzie działać:
getFacesContext().getExternalContext().redirect(url);
getFacesContext().responseComplete()
// => Can only redirect during ACTION_PHASE
Ten błąd jest logiczne, ale czy istnieje rozwiązanie życie przekierowania.
To może być realizowane w innej funkcji, zwany inaczej, muszę tylko Hibernate Session (ustawiony na początku fazy renderowania)
masz pomysły, aby rozwiązać ten problem?
Dzięki!
ps: <redirect />
lub ?faces-redirect
nie działają z portletami.
Dziękuję za wyjaśnienia.Pomyślę o innym rozwiązaniu i jeśli to konieczne, zmienię architekturę portletu. –
Innym _ackim_ rozwiązaniem jest użycie portalu PortalUtil.getHttpServletResponse w celu znalezienia oryginalnego żądania HTTP i użycia sendRedirect. –
@TobiasLiefke * też * hacky IMHO - odpowiedź mogła już zostać zatwierdzona podczas renderowania. Lub portlet może być dostarczany za pośrednictwem Ajax, nawet jako część całej strony. To może zadziałać, ale może również zadziałać teraz i przerwać jakąś przyszłą aktualizację appserver ... –