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

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

У меня есть страница, которая предназначена для того, чтобы позволить людям выполнять действие после выполнения URL-адреса обратного вызова (например, как ссылка, встроенная в электронную почту или в качестве параметра URL-адреса обратного вызова для некоторой внешней службы проверки подлинности или оплаты). В моем случае мне нужно reset пароль. 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";
  }
}

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

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

Ответ 1

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

например.

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

См. также: