Хит метод бина и перенаправить на запрос GET - PullRequest
12 голосов
/ 20 сентября 2011

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

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

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

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

Я думаю, что у меня должен быть метод бина, такой как:

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

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

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

1 Ответ

25 голосов
/ 20 сентября 2011

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

* 1006 Е.Г. *

<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.
}

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

...