JSFアプリケーションにログインを実装していて、リダイレクトに問題があります。
アプリのすべてのxhtmlでログインフォームを利用できるようにしたいのですが、ログインが成功または失敗した後、ユーザーがログインをクリックしたときと同じページにとどまりたいと思います。
ManagedBean methongでnullを返そうとしましたが、webPageが更新されないため機能しません。ビューロジックを機能させるには、ページを更新する必要があります。
これはログインフォームです:
<h:form id="loginForm" rendered="#{!loginBean.estaLogueado()}">
<p:panel header="#{msg.header_login}">
<h:outputLabel for="login" value="#{msg.login}"/>
<p:inputText id="login" value="#{loginBean.usuario}"></p:inputText><br/>
<h:outputLabel for="pwd" value="#{msg.password}"/>
<p:inputText id="pwd" type="password" value="#{loginBean.password}"></p:inputText><br/>
<p:commandButton action="#{loginBean.login()}" value="Login"/>
</p:panel>
</h:form>
<h:form id="logoutForm" rendered="#{loginBean.estaLogueado()}">
Bienvenido #{loginBean.nombreUsuario}!!<br/>
<p:commandButton action="#{loginBean.logout()}" value="Desconectar"/>
</h:form>
そして、これはaction属性のメソッドです。
public String login(){
currentUser = gu.login(usuario, password);
return null;
}
「login.xhtml」のような固定されたxhtmlではなく、ユーザーがログインしたxhtmlに戻る方法がありますか?
redirect to request URI だけです。
public void login() throws IOException {
// ...
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());
}
私に関する限り、この目的には2つの方法があります。
?faces-redirect=true
を追加して、実際の更新を行う必要があります。最初の解決策。
<h:form id="loginForm" rendered="#{!loginBean.estaLogueado()}">
<p:panel header="#{msg.header_login}">
<h:outputLabel for="login" value="#{msg.login}"/>
<p:inputText id="login" value="#{loginBean.usuario}"></p:inputText><br/>
<h:outputLabel for="pwd" value="#{msg.password}"/>
<p:inputText id="pwd" type="password" value="#{loginBean.password}"></p:inputText><br/>
<p:commandButton action="#{loginBean.login()}" value="Login" update=":loginForm :logoutForm"/>
</p:panel>
</h:form>
<h:form id="logoutForm" rendered="#{loginBean.estaLogueado()}">
Bienvenido #{loginBean.nombreUsuario}!!<br/>
<p:commandButton action="#{loginBean.logout()}" update=":loginForm :logoutForm" value="Desconectar"/>
</h:form>
update属性は、コンポーネントを更新します。
2番目の解決策
実際の更新のために、アクションメソッドの戻り値に?faces-redirect=true
を追加します
public String login(){
currentUser = gu.login(usuario, password);
return "login?faces-redirect=true";
}