servlet filters example dofilter java servlets login servlet-filters

java - filters - servlet security filter example



¿Cómo redirigir a la página de inicio de sesión cuando expira la sesión en la aplicación web Java? (9)

Estoy ejecutando una aplicación web en JBoss AS 5. También tengo un filtro de servlet que intercepta todas las solicitudes al servidor. Ahora, quiero redirigir a los usuarios a la página de inicio de sesión, si la sesión ha expirado. Necesito hacer esta comprobación ''isSessionExpired ()'' en el filtro y necesito redirigir al usuario en consecuencia. ¿Cómo lo hago? Estoy configurando el límite de tiempo de mi sesión en web.xml, como se muestra a continuación:

<session-config> <session-timeout>15</session-timeout> </session-config>


¿Cómo redirigir a la página de inicio de sesión cuando expira la sesión en la aplicación web Java?

Esta es una pregunta incorrecta. Debe diferenciar entre los casos "El usuario no ha iniciado sesión" y "La sesión ha expirado". Básicamente, desea redireccionar a la página de inicio de sesión cuando el usuario no está conectado. No cuando la sesión ha expirado. La respuesta actualmente aceptada solo comprueba HttpSession#isNew() . Pero esto obviamente falla cuando el usuario ha enviado más de una solicitud en la misma sesión cuando la JSP crea implícitamente la sesión o no. Por ejemplo, al presionar F5 en la página de inicio de sesión.

Como se dijo, en su lugar debería verificar si el usuario está conectado o no. Dado el hecho de que está haciendo este tipo de preguntas mientras los marcos de autenticación estándar como j_security_check , Shiro, Spring Security, etc. ya administran esto de manera transparente (y por lo tanto no habría necesidad de hacer este tipo de preguntas sobre ellos), eso solo puede significa que está utilizando un enfoque de autenticación de cosecha propia.

Suponiendo que está almacenando el usuario conectado en la sesión en algún servlet inicio de sesión como a continuación:

@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); } } }

Luego puede verificar eso en un filter inicio de sesión como se muestra a continuación:

@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); } } // ... }

No es necesario juguetear con frágiles HttpSession#isNew() .


Comprobar si la sesión es nueva.

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


Cuando el uso inicie sesión, ingrese su nombre de usuario en la sesión:

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

Al comienzo de cada página puedes hacer esto:

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


Dentro del filtro, inserte este JavaScript que traerá la página de inicio de sesión de esta manera. Si no lo hace, en su llamada AJAX obtendrá la página de inicio de sesión y se agregará el contenido de la página de inicio de sesión.

Dentro de su filtro o redirección, inserte este script en respuesta:

String scr = "<script>window.location=/""+request.getContextPath()+"/login.do/"</script>"; response.getWriter().write(scr);


Hasta el tiempo de espera de la sesión recibimos una solicitud normal, después de lo cual recibimos una solicitud de Ajax. Podemos identificarlo de la siguiente manera:

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


Necesita implementar la interfaz HttpSessionListener , el servidor notificará tiempos de espera de sesión.

Me gusta esto;

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"); } }

Verifique este ejemplo para una mejor comprensión

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


Puede usar un Filter y hacer la siguiente prueba:

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"); }

El código anterior no está probado .

Sin embargo, esta no es la solución más extensa. También debe probar que algún objeto o indicador específico del dominio esté disponible en la sesión antes de asumir que, dado que una sesión no es nueva, el usuario debe haber iniciado sesión. ¡ Sea paranoico !


encontré esta posible solución:

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()); } }


también puedes hacerlo con un filtro como este:

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); } } }

Puedes ver el resto en este tutorial