身份validationfilter和servletlogin

我有一个用于login的filter。 它在字段“用户名”和“密码”上执行文本检查。 当且仅当文本检查正确完成时,请求才会发送到Servlet。 后者执行必须与数据库交互的控制。 这条链是否正确?

前言:我收集你正在使用本地login,而不是容器pipe理login。 有关所有方法,请参阅如何处理数据库中用户的身份validation/授权?


filter(拦截器)不应该检查用户名/密码组合的有效性。 这是servlet(控制器)的责任。

filter应该仅检查用户是否login(通常只检查是否存在会话属性),然后继续请求或通过redirect回login页面来阻止该请求。

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

servlet应该收集提交的数据,在数据库中find关联的User ,如果find,则将其存储为会话属性,然后redirect到主页,否则重新显示带有validation错误的表单。

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

也可以看看:

  • 我们的servlet-过滤wiki页面
  • 我们的servlets wiki页面