JSF 2.2とPrimeFaces 5.3を使用してログイン機能画面を構築しています。しかし、私には問題があります。ユーザーがユーザー名とパスワードを入力したが、そのうちの1つが間違っているとします。それが起こると、ユーザーにエラーメッセージ "Username and/or password is incorrect"が表示されます。問題は、その瞬間にセッションを保存していることです。私は、ユーザーが正常にログインしたら、セッションを保存したい私のログインフォームは次のようになります。JSFログインフォーム - ログインが成功するとセッションを保存する
コントローラクラス(loginController)は、次のようになります<f:metadata>
<f:viewParam name="tipo" value="#{loginTipoController.tipo.tipo}" />
</f:metadata>
<h:form id="login">
<p:focus context="login" />
<p:graphicImage url="img/logog.JPG" width="448" height="119" />
<p>Digite su usuario y password.</p>
<p:outputLabel for="usuario" value="Usuario:" />
<p:inputText id="usuario" value="#{loginController.login.username}" />
<p:outputLabel for="password" value="Password:" />
<p:password id="password" value="#{loginController.login.password}" />
<p:messages autoUpdate="true" for="usuarioPassword" />
<p:commandButton value="Login" action="#{loginController.login()}" />
<p:button value="Regresar" outcome="index.jsf" />
</h:form>
:
@ManagedBean @SessionScoped パブリッククラスLoginController {
private Login login; private LoginTipo loginTipo; private LoginService service; public Login getLogin() { return login; } public void setLogin(Login login) { this.login = login; } public LoginService getService() { return service; } public void setService(LoginService service) { this.service = service; } @PostConstruct public void init() { login = new Login(); service = new LoginService(); } public String login() { FacesContext facesCont = FacesContext.getCurrentInstance(); loginTipo = facesCont.getApplication().evaluateExpressionGet(facesCont, "#{loginTipoController.tipo}", LoginTipo.class); login = service.login(login.getUsername(), login.getPassword(), loginTipo.getTipo()); if(login.getMensaje_id() != 0) { FacesContext.getCurrentInstance().addMessage("usuarioPassword", new FacesMessage(login.getMensaje())); ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.invalidateSession(); return ""; } else { return login.getMensaje(); } } //logout method public void logout() { ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.invalidateSession(); try { ec.redirect(ec.getRequestContextPath() + "/index.jsf"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
LoginService()クラスコードは、単にデータベースに行き、ユーザーが存在するかどうかをチェックするだけなので、入れません。
コントローラクラスのlogin()メソッドでは、ユーザーがログインに失敗したときに、ユーザーがログインできなかったことを通知します。エラーメッセージが表示されます。その後、私は次のコードを持っています:
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.invalidateSession();
私はセッションを破壊しています。私はそれをしなければならないことを避けたい!
上記のコードで、ec.getSessionMap()。put()は基本的に私のbeanをsessionScopeにしたのと同じように動作しますか? – Erick
これは正しいです。 – BalusC