2012-04-26 14 views
2

JSFをFacesで表示するためのログイン例を作成しています.PHPバックグラウンドがあるので、多くの困難があります。JSFログインセッションとリダイレクト

これは私がいくつかのGoogle検索に基づいて作業している方法です。

私は3つのコントローラとフォルダがあります。

メインコントローラを。 HomeController; LoginController;

私は1つのbuを表示せずに読みやすくするために設定します。

メインコントローラ:

package com.erp3.gui.controllers; 

import javax.faces.context.FacesContext; 

public class MainController { 

    public LoginController loginController; 

    public MainController() { 
     this.checkUserSession(); 
    } 

    public String checkUserSession() { 
     loginController = (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController"); 
     if (!loginController.getIsLoggedIn()) { 
      return "login.html"; 
     } else { 
      return null; 
     } 
    } 
} 

にHomeController:

package com.erp3.gui.controllers; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
public class HomeController extends MainController { 

    public String username; 

    public HomeController() { 
     super(); 
    } 
} 

LoginController:

package com.erp3.gui.controllers; 

import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.context.FacesContext; 

@ManagedBean 
public class LoginController { 

    public Boolean isLoggedIn = false; 
    private String username; 
    private String password; 
    private FacesMessage msg; 

    public String login() { 

     if (this.getUsername().equals("daniel") && this.getPassword().equals("123")) { 
      this.isLoggedIn = true;     
      FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginController", this); 
      return "home.html"; 
     } else { 
      this.isLoggedIn = false; 
      msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário ou senha inválida.", username); 
      FacesContext.getCurrentInstance().addMessage(null, msg); 
      return "login.html"; 
     } 
    } 

    public String logOut() { 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("loginController"); 
     return "login.html"; 
    } 
} 

ので、読書の私はセッションを作成するこの方法を見つけたOMEページ、それが正しい場合はNOはありません:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginController", this);

何が起こるかというと、偽リダイレクトlogin.xhtmlの場合にHomeControllerに、私は、セッションの状態を確認することです

もう一つは、私の中にログインしたとき、私はhome.xhtmlにリダイレクトしていますが、URLはlogin.xhtmlに残っていると私はhome.xhtmlに変更したときに、それは私にこの美しいエラーを返します:

Cant instantiate class: com.erp3.gui.controllers.HomeController. 

また、私は私のhome.xhtmlファイルを呼び出すときに、それはにHomeControllerロードすることを知っていただきたいと思いますかJavaは単にhome.xhtmlをロードしますか?

答えて

0

UICommandのコンポーネント(<h:commandButton>など)がコンストラクタではなく呼び出す実際のアクションメソッドでのみ、文字列の結果を返すナビゲーションが可能です。

例外は基本的にはnew HomeController()が失敗したという一般的な例外です。これは、スタックトレースにさらに根本的な原因があるはずです。おそらくNullPointerExceptionです。なぜなら、loginControllernullですか?いずれにしても、スタックトレース内の一番下の例外である根本的な原因は、最も重要な例外です。これを覚えておいてください。

public class MainController { 

    public MainController() throws IOException { 
     this.checkUserSession(); 
    } 

    public void checkUserSession() throws IOException { 
     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
     LoginController loginController = (LoginController) ec.getSessionMap().get("loginController"); 

     if (loginController == null || !loginController.getIsLoggedIn()) { 
      ec.redirect(ec.getRequestContextPath() + "/login.html"); 
     } 
    } 

} 

しかし、このアプローチは、技術的な問題があります。

両方の問題は、以下のように固定することができます。応答が既にコミットされた後にリダイレクトを送信するのは遅すぎます。Bean は、レスポンスの一部がすでにクライアントに送信された時点でのみ構築することができます。コンテナ管理の認証、または少なくともサーブレット・フィルタを参照してください。しかしそれは別の話です。

+0

HomeControllerが呼び出されたhome.htmlページを呼び出すと、私に説明できますか? – Gerep

+0

'home {{homeController}'によって 'home.xhtml'で参照されているかどうか、また別のマネージドBeanによって管理プロパティとして暗黙的に参照されているかどうかによって異なります。私はちょうどあなたがインターネット上で見つけたいくつかの緩いスニペットを共にするのではなく、まともなJSFの本を通過することをお勧めします。 – BalusC

+0

私のアプローチを修正する方法についての良いコンテンツを見つけることができるリンクがありますか? – Gerep

関連する問題