2012-10-24 20 views
7

Ho implementato un modulo di accesso utilizzando JSF e PrimeFaces. Ho usato this example nel sito web della vetrina PrimeFaces.Come accedere all'attributo di sessione nella pagina Facelets

Ho una pagina Facelets per mostrare un dataTable. Ora ho bisogno di integrare il modulo di accesso sopra con questa tabella. Quindi ho aggiunto poche righe a LoginBean.java per gestire l'attributo della sessione.

 if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {//valid user and paward 
     loggedIn = true; 
     msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", getUsername_db()); 
     //new lines 
     FacesContext context2 = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) context2.getExternalContext().getSession(true); 
     session.setAttribute("user", username); 
     //end of new lines 
     ... 

ho bisogno di nascondere una colonna dal DataTable, se l'utente non è connesso. Ora il mio problema è, come posso accedere attributo sessione all'interno della mia pagina Facelets?

risposta

14

Hai memorizzato l'utente che ha effettuato l'accesso come attributo di sessione con il nome "utente".

Quindi è in EL disponibili come segue:

#{user} 

Si può semplicemente utilizzare la parola chiave empty a EL per verificare se è presente o meno (cioè se è loggato o meno) ed è possibile utilizzare JSF attributo rendered del componente per indicare se generare output HTML o meno.

<h:panelGroup rendered="#{not empty user}"> 
    <p>Welcome #{user}, you have been logged in!</p> 
</h:panelGroup> 

Nel suo caso specifico di nascondere una colonna della tabella, basta usare come segue:

<p:column rendered="#{not empty user}"> 
    ... 
</p:column> 

un modo migliore per archiviare una sessione attributo viene utilizzato ExternalContext#getSessionMap(). In questo modo il tuo codice è privo di smelly javax.servlet.* importazioni.

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username); 

Estranei al problema concreto, perché il seguente controllo?

if (username.equals(getUsername_db()) && password.equals(getPassword_db())) { 

Perché non basta fare un SELECT ... FROM user WHERE username=? AND password=? in SQL? O non ti fidi del DB che restituisce la riga giusta?

+0

Grazie BalusC. Ma ho ottenuto l'utente come oggetto nella vista. qualcosa come questo ha mostrato "Utente @ 1a8b71e". Comunque ho ottenuto parte dalla tua risposta per risolvere il mio problema. Ho rimosso la parte relativa alle impostazioni della sessione e impostato la classe LoginBean come SessionScoped. E sono stato in grado di ottenere valori direttamente all'interno del mio tag panelGroup. Grazie ancora per il consiglio SQL. L'ho cambiato usando dichiarazioni preparate. –

+0

Apparentemente 'username' come mostrato nel codice non è affatto' String'. Forse hai semplificato troppo il codice nella domanda? Tra l'altro, il commento SQL non intendeva suggerire dichiarazioni preparate. Stai confrontando il nome utente e la password ** due volte ** (una volta in DB e un'altra in Java). Questo non ha senso. Basta controllare se DB ha restituito un record o no, questo è tutto. Non è necessario confrontare ancora una volta il nome utente/password che è già stato chiesto al DB di controllare e restituire. – BalusC

+0

Trovato! ma nella mia ultima query SQL ho usato solo il nome utente con la clausola Where. come: String query = "SELECT nome utente, password FROM utente WHERE username = '" + uname + "';"; Quindi potrei semplicemente rimuovere username.equals (parte getUsername_db(). Devo solo controllare la password in questo caso ... grazie per il tuo suggerimento –

Problemi correlati