Accesso alla sessione HTTP JSF

Provo a creare il modulo di accesso nell’applicazione web. nella pagina JSP che posso usare

 

ma ora sto usando JSF / Facelets per l’applicazione web. Non so come creare una sessione nel bean di back-up JSF per il client e controllare se l’utente è loggato o meno, quindi verrà reindirizzato alla pagina di login. chi può aiutarmi a darmi tutorial di collegamento per questi problemi? grazie prima

Ora ho un piccolo problema con la mapping nel codice web.xml snipped della class Filter

 @Override public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; LoginController controller = (LoginController) req.getSession() .getAttribute("loginController"); if (controller == null || !controller.isLoggedIn()) { res.sendRedirect("../admin/login.xhtml"); } else { chain.doFilter(request, response); } } 

e in web.xml I mappa con il tag

  userLoginFilter com.mcgraw.controller.UserLoginFilter  loginPage /login.xhtml    userLoginFilter /admin/*  

Ho un amministratore di cartella nel progetto web e controllo se l’utente non ha effettuato il login con il permesso di amministratore per non accedere alla pagina (posso fare il controllo dei permessi) ma quando uso il filtro il browser non capisce l’url ?? no StackTrace mostra quando il browser non comprende l’URL

Errore mostrato su Firefox

 The page isn't redirecting properly 

su IE sta caricando … caricamento. .. non stop

ora cambio condizione che controlla se req.getPathInfo.startsWith (“/ login.xhtml”) farà catena

Ho 2 idea ma risposta 500 HTTP STATUS

  if (controller == null || !controller.isLoggedIn()) { res.sendRedirect("../admin/login.xhtml"); if(req.getPathInfo().startsWith("/login.xhtml")){ chain.doFilter(request, response); } } else { chain.doFilter(request, response); } 

===============

 if (controller == null || !controller.isLoggedIn()) { if (!req.getPathInfo().startsWith("/login.xhtml")) { res.sendRedirect("../admin/login.xhtml"); } else { chain.doFilter(request, response); } } else { chain.doFilter(request, response); } 

====================== aggiornamento class loginController

 package com.mcgraw.controller; import com.DAO.UserBean; import com.entity.IUser; import java.io.Serializable; import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; /** * @author Kency */ @ManagedBean @SessionScoped public class LoginController implements Serializable { @EJB private UserBean userBean; private IUser user; private boolean admin; private boolean mod; private PasswordService md5; /** Creates a new instance of LoginController */ public LoginController() { user = new IUser(); md5 = new PasswordService(); } // getter / setter public boolean isMod() { return mod; } public void setMod(boolean mod) { this.mod = mod; } public IUser getUser() { return user; } public void setUser(IUser user) { this.user = user; } public boolean isAdmin() { return admin; } public void setAdmin(boolean admin) { this.admin = admin; } public String cplogin() { String md5Password = md5.md5Password(user.getPassword()); if (userBean.userLogin(user.getUsername(), md5Password) != null) { if (user.getUsername() != null || md5Password != null) { user = userBean.userLogin(user.getUsername(), md5Password); if (user.getGroups().getAdmin() != null) { setAdmin(user.getGroups().getAdmin()); } if (user.getGroups().getMods() != null) { setMod(user.getGroups().getMods()); } if (isAdmin() == true || isMod() == true) { return "home"; } else { return "login"; } } else { return "login"; } } else { return "login"; } } public String logout() { user = null; return "login"; } public boolean isLoggedIn() { return user != null; } } 

Ho un nuovo problema se renderizzi JSF taglib con metodo loggedIn, nella pagina indice (non nella cartella admin) l’utente non effettua il login può vedere ciò che renderò esempio, <== questo come se l'utente non login utente non può vedere ma perché può vederlo?

Puoi in JSF ottenere / impostare gli attributi di sessione HTTP tramite ExternalContext#getSessionMap() che è fondamentalmente un wrapper attorno a HttpSession#get/setAttribute() .

 @ManagedBean @RequestScoped public class LoginController { private String username; private String password; @EJB private UserService userService; public String login() { User user = userService.find(username, password); FacesContext context = FacesContext.getCurrentInstance(); if (user == null) { context.addMessage(null, new FacesMessage("Unknown login, try again")); username = null; password = null; return null; } else { context.getExternalContext().getSessionMap().put("user", user); return "userhome?faces-redirect=true"; } } public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "index?faces-redirect=true"; } // ... } 

Nella pagina Facelets, basta associare il username e la password ai campi di input per questo bean e richiamare l’azione login() conseguenza.

      

Gli attributi di sessione sono direttamente accessibili in EL. Un attributo di sessione con nome user è in EL disponibile come #{user} . Quando si verifica se l’utente ha effettuato il login in qualche attributo rendered , è sufficiente verificare se è empty o meno.

  

Welcome, #{user.fullName}

L’azione di disconnessione fondamentalmente distrugge solo la sessione.


Per quanto riguarda il controllo di una richiesta in arrivo se un utente ha effettuato l’accesso o meno, è sufficiente creare un Filter che doFilter() all’incirca quanto segue nel metodo doFilter() :

 @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); String loginURI = request.getContextPath() + "/login.xhtml"; boolean loggedIn = session != null && session.getAttribute("user") != null; boolean loginRequest = request.getRequestURI().equals(loginURI); boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER); if (loggedIn || loginRequest || resourceRequest) { chain.doFilter(request, response); } else { response.sendRedirect(loginURI); } } 

Mappalo su un url-pattern copre le pagine riservate, ad esempio /secured/* , /app/* , ecc.

Guarda anche:

  • Come gestire l’autenticazione / authorization con gli utenti in un database?
  • Il reindirizzamento dell’authorization alla scadenza della sessione non funziona all’invio di un modulo JSF, la pagina rimane invariata

Prova questo nel bean di supporto quando viene ricevuta una richiesta (come in un metodo di azione):

 HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); HttpSession session = request.getSession(); 

Quindi puoi lavorare con la richiesta e gli oggetti di sessione proprio come facevi con JSP, impostando gli attributi e così via.

Si potrebbe anche voler dare un’occhiata alla mia domanda relativa sul controllo della sessione del client in un filtro servlet . Potresti scrivere un filtro simile per verificare l’accesso dell’utente nella loro HttpSession e poi fare un reindirizzamento (o RequestDispatch come ho fatto io) alla tua pagina di accesso, se necessario.