Liferay Portlet и JSF: перенаправление во время фазы рендеринга - PullRequest
5 голосов
/ 30 июля 2011

У меня проблема с реализацией простого перенаправления HTTP.

Я использую Liferay 6.0.6, наши портлеты созданы с JSF2.0 / PortletFaces .

Я хочу вызвать перенаправление при загрузке представления (а не при запуске действия). В настоящее время моя функция вызывается слушателем PreRenderView.

<f:metadata>
  <f:event listener="#{myControler.dispatch}" type="preRenderView" />
</f:metadata>

В этой функции я могу проверять права доступа, делать другие вещи, а в некоторых случаях я хочу перенаправить пользователя на новую страницу (а не в другое представление).

Я пробовал несколько способов, но безуспешно. В частности, я думал, что этот метод будет работать:

getFacesContext().getExternalContext().redirect(url);
getFacesContext().responseComplete()
// => Can only redirect during ACTION_PHASE

Эта ошибка логична, но есть ли решение для force перенаправления.

Это может быть реализовано в другой функции, называемой иначе, мне нужен только Hibernate Session (устанавливается в начале фазы рендеринга)

У вас есть идеи для решения этой проблемы?
Спасибо!

ps: <redirect /> или ?faces-redirect не работают с портлетами.

Ответы [ 3 ]

10 голосов
/ 30 июля 2011

Вы не можете сделать это на этапе рендеринга.Причины:

  • Возможно, портлеты отображаются асинхронно, поэтому страница может уже отображаться при визуализации вашего портлета
  • Возможно, что части страницы уже доставлены вклиент, так что заголовки HTTP уже отправлены - по этой причине у вас нет доступа к ним на этапе рендеринга
  • Каков будет ожидаемый результат, если два портлета, отображаемых на одной странице, будутрешить, что они хотели бы пересылать на другую страницу?Кто победит?

Хакерский обходной путь - это сделать какой-то редирект javascript, но это очень нелепообразно и может испортить ожидания других (плюс, некоторые части страницы могут уже отображаться,заставляя ваших пользователей заполнять форму только для перенаправления вашей подпрограммой javascript.

Пожалуйста, переосмыслите проблему и примите другое решение - это действительно стоит сделать в среде портала.

0 голосов
/ 25 апреля 2015

Я использую это, и оно работает для меня:

    public void preRenderView() throws IOException {

        if (!checkUtente()) {  

              FacesContext fc = FacesContext.getCurrentInstance(); 

              NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();

              navigationHandler.handleNavigation(fc, null, "errore.xhtml?faces-redirect=true");

              fc.renderResponse(); 
        }

    }
0 голосов
/ 11 августа 2011

Используйте метод ниже, он будет работать

public static void redirect(final String url) throws IOException {

            final javax.portlet.PortletResponse portletResponse
            = getPortletResponse();

            if (portletResponse instanceof ActionResponse) {

                final javax.portlet.ActionResponse actionResponse
                = (javax.portlet.ActionResponse) portletResponse;

                actionResponse.sendRedirect(url);

            } else if (portletResponse instanceof ResourceResponse) {

                final FacesContext ctx = FacesContext.getCurrentInstance();
                if (ctx.getPartialViewContext().isPartialRequest()) {

                    final ResourceResponse portletResResp
                    = (ResourceResponse) portletResponse;
                    PartialResponseWriter pwriter;
                    final ResponseWriter writer = ctx.getResponseWriter();
                    if (writer instanceof PartialResponseWriter) {
                        pwriter = (PartialResponseWriter) writer;
                    } else {
                        pwriter = ctx.getPartialViewContext()
                        .getPartialResponseWriter();
                    }
                    portletResResp.setContentType(Constants.CONTENT_TYPE);
                    portletResResp.setCharacterEncoding(Constants.ENCODING_TYPE);
                    // addResponseHeader("Cache-Control", "no-cache");
                    pwriter.startDocument();
                    pwriter.redirect(url);
                    pwriter.endDocument();
                    ctx.responseComplete();
                } else {
                    throw new UnsupportedEncodingException(
                            "Can only redirect during RESOURCE_PHASE "
                            + "if a Partial-(JSF AJAX)-Request  has "
                            + "been triggered");
                }
            } else {
                throw new UnsupportedEncodingException(
                        "Can not redirect during the current phase: "
                        + portletResponse.getClass().getSimpleName());
            }
        }
...