String sql="select * from reg where username='"+user"' and password='"+pwd"'";
这是一种极其糟糕的做法。这种方法要求通过请求将用户名和密码传递给普通的普通版本。此外,还有一个 SQL 注入攻击漏洞。
利用会话,在 JSP/Servlet 中您可以HttpSession http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpSession.html为了。实际上也没有必要在每个请求上一次又一次地使用数据库Filter
。这是不必要的昂贵。就放User
在会话中使用Servlet
并使用Filter
检查每个请求是否存在。
从一个开始/login.jsp
:
<form action="login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit"> ${error}
</form>
然后,创建一个LoginServlet
映射到url-pattern
of /login
并具有doPost()
实施如下:
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Put user in session.
response.sendRedirect("/secured/home.jsp"); // Go to some start page.
} else {
request.setAttribute("error", "Unknown login, try again"); // Set error msg for ${error}
request.getRequestDispatcher("/login.jsp").forward(request, response); // Go back to login page.
}
然后,创建一个LoginFilter
映射到url-pattern
of /secured/*
(但是您可以选择自己的,例如/protected/*
, /restricted/*
, /users/*
等,但这必须至少覆盖所有受保护的页面,您还需要将 JSP 放在 WebContent 中的相应文件夹中)并具有doFilter()
实施如下:
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURI = request.getContextPath() + "/login.jsp";
boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
chain.doFilter(request, response); // User is logged in, just continue request.
} else {
response.sendRedirect(loginURI); // Not logged in, show login page.
}
应该是这样。希望这可以帮助。
为了了解如何UserDAO
看起来像,你可能会发现本文 http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html有用。它还涵盖了如何使用PreparedStatement http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html使您的 Web 应用程序免受 SQL 注入攻击。
也可以看看:
- Java Web应用程序中Session过期时如何重定向到登录页面? https://stackoverflow.com/questions/1026846/how-to-redirect-to-login-page-when-session-is-expired-in-java-web-application/32627461#32627461
- 用于登录的身份验证过滤器和 servlet https://stackoverflow.com/questions/13274279/authentication-filter-and-servlet-for-login/
- 如何处理数据库中用户的身份验证/授权? https://stackoverflow.com/questions/9965708/how-to-handle-authentication-authorization-with-users-in-a-database