2012-05-24 45 views
1

我正在嘗試使用jsf 2.0表單來驗證用戶身份。 另外我想創建UserPrincipals。 我認爲用HttpServletRequest.login方法我可以創建一個新的UserPrincipal。 http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.htmlJSF 2.0登錄+設置用戶主體

我所做的是:

表現公式:

<h:form> 
     <h:outputLabel value="Name" for="name"/> 
     <h:inputText id="name" value="#{userMng.user.name }"/> 
     <br/> 
     <h:outputLabel value="Passwort" for="pw"/> 
     <h:inputSecret id="pw" value="#{userMng.user.password }"/> 
     <br/> 
     <h:commandButton type="submit" value="Submit" action="#{ userMng.login }"/> 
    </h:form> 

UserMng(sessionscoped): 登錄方法:

public String login() { 
     String ret = "error"; 
     if (user.getName().equals("test") && user.getPassword().equals("test")) { 
      FacesContext context = FacesContext.getCurrentInstance(); 
      HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 

     try { 
      request.login(this.user.getName(), this.user.getPassword()); 
      LOGGER.info("Login the user"); 
      ret = "success"; 
//   this.user = userDAO.find(this.username, this.password); 
     } catch (ServletException e) { 
      // Handle unknown username/password in request.login(). 
      context.addMessage(null, new FacesMessage("Unknown login")); 
     } 
    } 
    LOGGER.info(ret); 
    return ret; 
} 

但是,當我要打印UserPrincipal.getName登錄後,當我打電話時,我得到一個NullpointerException:

request.getUserPrincipal().getName(); 

那麼,我的代碼或我的方式來成功登錄後創建一個新的UserPrincipal最新怎麼了?

最好

回答

3

用戶主體僅在登錄後的後續請求中可用。您需要在登錄後發送重定向以強制瀏覽器創建新的請求。

ret = "success?faces-redirect=true"; 

當在視圖中打印用戶名時,最好使用EL。 HttpServletRequest在EL中,可由#{request}獲得。

<p>Welcome #{request.userPrincipal.name}!</p> 

或者只是快捷

<p>Welcome #{request.remoteUser}!</p> 
+0

當我做RET = 「成功的面孔重定向=真的嗎?」;我的導航規則不起作用。 JSF不會重定向到成功頁面 – veote

+0

此外,似乎登錄方法不會創建新的Principal。當我想在request.login – veote

+0

之後用我的登錄方法打印它時,UserPrincipal也是一個空對象哦,你還在使用老式的XML導航規則嗎?把''放在那裏,或者像''viewId?faces-redirect = true「'那樣通過像''viewId''這樣的隱式導航替換所有的導航規則。 – BalusC