2012-04-26 96 views
2

我創建了一個登錄示例來看看面對JSF的JSF,我有一個PHP背景,所以我有很多困難。JSF登錄會話和重定向

這是我工作的基礎上,一些谷歌搜索。

我有3個控制器的文件夾:

MainController; HomeController; LoginController;

我會顯示每一個BU沒有得到,並設置,使其更容易閱讀。

MainController:

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"; 
    } 
} 

所以,在閱讀小號青梅頁,我發現創建一個會話這樣,如果它是正確的不NO:

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

發生什麼事是對的HomeController我檢查會話狀態,如有虛假重定向login.xhtml

另一件事,當我登錄,我重定向到home.xhtml但網址仍然在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 可以只在響應的一部分已經被髮送到客戶端的時刻構建。看看容器管理的認證,或者至少在servlet過濾器。但這是另一回事。

+0

如果當我調用HomeController的home.html頁面時,你能解釋一下嗎? – Gerep 2012-04-26 16:39:22

+0

取決於它是否被home.xhtml中的'#{homeController}'引用,或者被其他託管bean隱式地作爲託管屬性。我建議只閱讀一本體面的JSF書籍,而不是在互聯網上拼湊一些鬆散的片段。 – BalusC 2012-04-26 16:39:43

+0

你有鏈接,我可以找到一些關於如何糾正我的方法的好內容? – Gerep 2012-04-26 16:42:13

相關問題