Come redirect alla pagina di accesso quando la sessione è scaduta nell’applicazione Web Java?

Sto eseguendo un’applicazione web in JBoss AS 5. Ho anche un filtro servlet che intercetta tutte le richieste al server. Ora, voglio redirect gli utenti alla pagina di accesso, se la sessione è scaduta. Ho bisogno di fare questo controllo ‘isSessionExpired ()’ nel filtro e ho bisogno di redirect l’utente di conseguenza. Come lo faccio? Sto impostando il limite di tempo della mia sessione in web.xml, come di seguito:

 15  

Puoi usare un filtro e fare il seguente test:

 HttpSession session = request.getSession(false);// don't create if it doesn't exist if(session != null && !session.isNew()) { chain.doFilter(request, response); } else { response.sendRedirect("/login.jsp"); } 

Il codice sopra non è stato testato .

Questa però non è la soluzione più ampia. Dovresti anche verificare che qualche object o flag specifico del dominio sia disponibile nella sessione prima di assumere che, poiché una sessione non è nuova, l’utente deve aver effettuato l’accesso. Sii paranoico !

Come redirect alla pagina di accesso quando la sessione è scaduta nell’applicazione Web Java?

Questa è una domanda sbagliata. È necessario distinguere tra i casi “Utente non registrato” e “Sessione scaduta”. In pratica, si desidera redirect alla pagina di accesso quando l’utente non ha effettuato l’accesso. Non quando la sessione è scaduta. La risposta attualmente accettata verifica solo HttpSession#isNew() . Ma questo ovviamente fallisce quando l’utente ha inviato più di una richiesta nella stessa sessione quando la sessione viene creata implicitamente dal JSP o cosa no. Ad esempio quando si preme F5 nella pagina di accesso.

Come detto, dovresti invece controllare se l’utente è loggato o meno. Dato che stai facendo questo tipo di domande mentre framework di autenticazione standard come j_security_check , Shiro, Spring Security, ecc gestiscono già in modo trasparente questo (e quindi non ci sarebbe bisogno di fare questo tipo di domande su di loro), che può solo significa che stai usando un approccio di autenticazione homegrown.

Supponendo che tu stia memorizzando l’utente che ha effettuato l’accesso nella sessione in qualche servlet di accesso come di seguito:

 @WebServlet("/login") public class LoginServlet extends HttpServlet { @EJB private UserService userService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = userService.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect(request.getContextPath() + "/home"); } else { request.setAttribute("error", "Unknown login, try again"); doGet(request, response); } } } 

Quindi puoi verificarlo in un filtro di login come di seguito:

 @WebFilter("/*") public class LoginFilter implements Filter { @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"; boolean loggedIn = session != null && session.getAttribute("user") != null; boolean loginRequest = request.getRequestURI().equals(loginURI); if (loggedIn || loginRequest) { chain.doFilter(request, response); } else { response.sendRedirect(loginURI); } } // ... } 

Non c’è bisogno di giocherellare con i controlli HttpSession#isNew() .

puoi farlo anche con un filtro come questo:

 public class RedirectFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; //check if "role" attribute is null if(req.getSession().getAttribute("role")==null) { //forward request to login.jsp req.getRequestDispatcher("/login.jsp").forward(request, response); } else { chain.doFilter(request, response); } } } 

puoi vedere il resto in questo tutorial

Controlla se la sessione è nuova.

 HttpSession session = request.getSession(false); if (!session.isNew()) { // Session is valid } else { //Session has expired - redirect to login.jsp } 

All’interno del filtro si inserisce questo JavaScript che porterà la pagina di accesso come questa. Se non lo fai, nella tua chiamata AJAX otterrai la pagina di accesso e il contenuto della pagina di accesso verrà aggiunto.

All’interno del filtro o del reindirizzamento inserisci questo script in risposta:

 String scr = ""; response.getWriter().write(scr); 

È necessario implementare l’interfaccia HttpSessionListener , il server notificherà i timeout della sessione.

come questo;

 import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class ApplicationSessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent event) { System.out.println("Session Created"); } public void sessionDestroyed(HttpSessionEvent event) { //write your logic System.out.println("Session Destroyed"); } } 

Controlla questo esempio per una migliore comprensione

http://www.myjavarecipes.com/how-to-catch-session-timeouts/

Fino al timeout della sessione otteniamo una richiesta normale, dopo di che otteniamo una richiesta Ajax. Possiamo identificarlo nel seguente modo:

 String ajaxRequestHeader = request.getHeader("X-Requested-With"); if ("XMLHttpRequest".equals(ajaxRequestHeader)) { response.sendRedirect("/login.jsp"); } 

ho trovato questa soluzione ansible:

 public void logout() { ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext(); String ctxPath = ((ServletContext) ctx.getContext()).getContextPath(); try { //Use the context of JSF for invalidate the session, //without servlet ((HttpSession) ctx.getSession(false)).invalidate(); //redirect with JSF context. ctx.redirect(ctxPath + "absolute/path/index.jsp"); } catch (IOException ex) { System.out.println(ex.getMessage()); } } 

Quando l’uso si collega, inserisci il suo nome utente nella sessione:

 `session.setAttribute("USER", username);` 

All’inizio di ogni pagina puoi farlo:

 <% String username = (String)session.getAttribute("USER"); if(username==null) // if session is expired, forward it to login page %>  <% { } %>