Authentifizierungsfilter und Servlet für die Anmeldung

Ich habe einen Filter für die Anmeldung verwendet. Es führt eine textliche Überprüfung in den Feldern “Benutzername” und “Passwort” durch. Wenn und nur wenn die textliche Überprüfung korrekt durchgeführt wird, geht die Anfrage an das Servlet. Letzteres führt das Steuerelement aus, das mit der database interagieren muss. Ist diese Kette korrekt?

    Vorwort: Ich nehme an, Sie verwenden eine selbst erstellte Anmeldung anstelle einer containergesteuerten Anmeldung. Informationen dazu finden Sie unter Vorgehensweise bei der Authentifizierung / Autorisierung mit Benutzern in einer database.


    Der Filter (der Interceptor) sollte die Gültigkeit der Kombination Benutzername / Passwort nicht überprüfen. Das ist die Verantwortung des Servlets (der Steuerung).

    Der Filter sollte lediglich überprüfen, ob der Benutzer eingeloggt ist oder nicht (in der Regel nur das Vorhandensein eines Sitzungsattributs prüfen) und dann die Anfrage fortsetzen oder sie blockieren, indem sie zurück zur Anmeldeseite umleitet.

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

    Das Servlet sollte die gesendeten Daten sammeln, den zugehörigen User in der database finden und, falls gefunden, dieses als Sitzungsattribut speichern und dann auf die Homepage redirect, ansonsten das Formular mit validationserrorsn erneut anzeigen.

     @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 messages = new HashMap(); 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); } } 

    Siehe auch:

    • Unsere Servlet-Filter Wiki-Seite
    • Unsere Servlets Wiki Seite