2012-04-26 57 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

相关问题