String sql=”select * from reg where username='”+user+”‘ and pass='”+pwd+”‘”;
這是一個非常糟糕的做法.這種方法要求用戶名和密碼都通過請求傳遞普通香草.而且,你有一個SQL注入攻擊漏洞.
利用會話,在JSP / Servlet中你有HttpSession.實際上也沒有必要在使用過濾器的每個請求上一次又一次地命中數據庫.這是不必要的昂貴.只需使用Servlet將User置于會話中,并使用Filter檢查每個請求的存在.
從/login.jsp開始:
${error}
然后,創建一個LoginServlet,它映射到/ login的url-pattern上,并按如下方式實現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.
}
然后,創建一個映射在/ secured / *的url-pattern上的LoginFilter(你可以選擇你自己的,例如/ 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的外觀,您可能會發現this article很有用.它還介紹了如何使用PreparedStatement保存您的Web應用程序免受SQL注入攻擊.
也可以看看: