uso tutorial programación mvc framework español edicion cuarta books arquitectura accion authentication servlets servlet-filters login-control

authentication - tutorial - Filtro de autenticación y servlet para iniciar sesión



spring mvc 4 tutorial español (1)

Tengo un filtro utilizado para el inicio de sesión. Realiza una verificación textual, en los campos "Nombre de usuario" y "Contraseña". Si y solo si la verificación textual se realiza correctamente, la solicitud se envía al servlet. Este último realiza el control que tiene que interactuar con la base de datos. Es esta cadena correcta?


Prefacio: supongo que está utilizando el inicio de sesión local en lugar del inicio de sesión administrado por contenedor. Para todos los modos, consulte ¿Cómo manejar la autenticación / autorización con usuarios en una base de datos?

El filtro (el interceptor) no debe verificar la validez del combo nombre de usuario / contraseña. Esa es la responsabilidad del servlet (el controlador).

El filtro debería simplemente verificar si el usuario está conectado o no (generalmente solo verificando la presencia de un atributo de sesión) y luego continuar la solicitud o bloquearlo redireccionando a la página de inicio de sesió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); } } // ... }

El servlet debe recopilar los datos enviados, buscar el User asociado en la base de datos y, si se encuentra, almacenarlo como un atributo de sesión y luego redirigirlo a la página de inicio; de lo contrario, vuelva a mostrar el formulario con errores de validació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"); Map<String, String> messages = new HashMap<String, String>(); if (username == null || username.isEmpty()) { messages.put("username", "Please enter username"); } if (password == null || password.isEmpty()) { messages.put("password", "Please enter password"); } if (messages.isEmpty()) { User user = userService.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect(request.getContextPath() + "/home"); return; } else { messages.put("login", "Unknown login, please try again"); } } request.setAttribute("messages", messages); request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } }

Ver también:

  • Nuestra página wiki servlet-filters
  • Nuestra página wiki servlets