Нажмите на метод компонента и перенаправьте запрос GET

Я использую JSF 2 и PrimeFaces 2.1 на GlassFish.

У меня есть страница, которая предназначена для того, чтобы люди могли выполнять действие после перехода по URL-адресу обратного вызова (например, в виде ссылки, встроенной в электронную почту, или в качестве параметра URL-адреса обратного вызова какой-либо внешней службы аутентификации или оплаты). В моем случае мне нужно сбросить пароль. URL-адрес обратного вызова имеет параметр token GET, например:

http://example.com/app/resetPasswordForm.jsf?token=abc123

При загрузке страницы resetPasswordForm.jsf мне нужно проверить, действителен ли токен, и перенаправить на главный экран приложения, если он недействителен.

Я думаю, что есть метод bean, например:

public String resetPasswordHandler.showResetForm(String token) {
  if /* token is valid */ {
    return "resetPasswordForm.jsf";
  } else {
    return "main.jsf";
  }
}

Но как я могу заставить этот метод попасть при загрузке страницы?

Не знаю, как поступить - предложения приветствуются.


person Community    schedule 20.09.2011    source источник
comment
Я использую JSF2 (с Primefaces 2.1) на GlassFish - спасибо   -  person    schedule 20.09.2011


Ответы (1)


Используйте <f:viewAction> для запуска метода bean-компонента перед рендерингом представления и просто возврата результата навигации (который будет неявно рассматриваться как перенаправление).

E.g.

<f:metadata>
    <f:viewParam name="token" value="#{authenticator.token}" />
    <f:viewAction action="#{authenticator.check}" />
</f:metadata>

с участием

@ManagedBean
@RequestScoped
public class Authenticator {

    private String token;

    public String check() {
        return isValid(token) ? null : "main.jsf";
    }

    // Getter/setter.
}

Если вы еще не используете JSF 2.2, вы можете использовать <f:event type="preRenderView"> обходной путь в сочетании с ExternalContext#redirect().

<f:metadata>
    <f:viewParam name="token" value="#{authenticator.token}" />
    <f:event type="preRenderView" listener="#{authenticator.check}" />
</f:metadata>

с участием

@ManagedBean
@RequestScoped
public class Authenticator {

    private String token;

    public void check() throws IOException {
        if (!isValid(token)) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("main.jsf");
        }
    }

    // Getter/setter.
}

Смотрите также:

person BalusC    schedule 20.09.2011
comment
Отлично выглядит и работает! Еще один вопрос: когда я добавляю FacesMessage в FacesContext из-за externalContext.redirect, сообщение о лицах не отображается в main.jsf. Это нормально, и есть ли способ заставить это работать? - person ; 20.09.2011
comment
Да, это нормально. Сообщения Faces ограничены запросом. Перенаправление указывает браузеру запустить новый HTTP-запрос. Вам нужно либо передать параметр запроса в URL перенаправления и разрешить отображение перехвата сообщения на этом, либо вызвать Flash#setKeepMessages() с true, чтобы оживить их с помощью файла cookie (который, в свою очередь, в настоящее время имеет любопытную ошибку в Mojarra при определенных обстоятельствах, поэтому помните об этом, см. также java.net/jira/browse/JAVASERVERFACES-1751 ). - person BalusC; 20.09.2011
comment
Не могли бы вы объяснить, как это сделать с помощью валидатора на ‹f:viewParam› - person Salih Erikci; 01.12.2014
comment
@BalusC: метод действия для компонента просмотра-действия запускается на этапе вызова логики приложения прямо перед методом действия, который привязан к некоторой командной кнопке. Принимая во внимание, что для просмотра перед рендерингом он запускается на этапе ответа рендеринга. Я немного смущен тем, можно ли выполнять перенаправление с предварительным просмотром. Не будет ли тогда достаточно поздно. - person Farhan Shirgill Ansari; 19.04.2016
comment
@Shirgill: перенаправление по-прежнему возможно, пока ответ не зафиксирован (т. Е. Пока JSF не отобразил ответ). - person BalusC; 19.04.2016