我需要用java编写一个登录servlet,也使用cookie。这些是要求:
-页面必须提供注册和登录(用户选择要做什么)。如果他们选择注册,输入信息后(只需姓名、用户名和密码,登录和注册相同),他们将被重定向到登录页面。 - 在登录的情况下,应用程序需要计算登录尝试次数(最多 2 次错误尝试),然后向用户显示一条消息,让他们知道 10 秒后不再有尝试。这必须通过 cookie 来完成。 -应用程序必须检查正在登录的用户是否已经在数据库中(一个假的,只是一个ArrayList)。 - 登录成功后,将显示“欢迎”消息。 -用户也必须能够注销。
这是我到目前为止所拥有的:
@WebServlet("/loginservlet")
public class LoginServlet extends HttpServlet {
private static final int ATTEMPTS_MAX = 2;
private static final Logger logger = Logger.getLogger(LoginServlet.class.getName());
ArrayList<User> list = new ArrayList<>();
public LoginServlet() {
User u1 = new User("Alba", "alba01", "pass");
User u2 = new User("Maira", "maira01", "pass");
User u3 = new User("Carol", "carol01", "pass");
User u4 = new User("Debora", "debo01", "pass");
list.add(u1);
list.add(u2);
list.add(u3);
list.add(u4);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String task = request.getParameter("task");
if (task == null) {
response.sendRedirect("index.html");
return;
}
switch (task) {
case "formlog":
showFormLog(request,response);
break;
case "formreg":
showFormReg(request,response);
break;
case "register":
processReg(request,response);
break;
case "login":
processLog(request,response);
break;
case "default":
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid task");
break;
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}
private void showFormLog(HttpServletRequest request, HttpServletResponse response) {
try {
RequestDispatcher dispatcher=null;
dispatcher=request.getRequestDispatcher("/formlog.jsp");
dispatcher.forward(request, response);
} catch (ServletException | IOException ex) {
logger.log(Level.SEVERE, "Error showing the log form", ex);
}
}
private void showFormReg(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
RequestDispatcher dispatcher = null;
dispatcher=request.getRequestDispatcher("/formreg.jsp");
dispatcher.forward(request, response);
} catch (ServletException ex) {
logger.log(Level.SEVERE, "Error showing the reg form", ex);
}
}
private void processReg(HttpServletRequest request, HttpServletResponse response) throws IOException {
String nameReg=request.getParameter("name");
String usernameReg=request.getParameter("username");
String passReg=request.getParameter("password");
if(nameReg !=null && usernameReg !=null && passReg !=null){
list.add(new User(nameReg, usernameReg, passReg));
response.sendRedirect("loginservlet?task=formlog");
}else{
response.sendRedirect("loginservlet?task=formreg");
}
}
private void processLog(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String nameLog=request.getParameter("name");
String usernameLog=request.getParameter("username");
String passLog=request.getParameter("password");
logger.info("Login attempt: name=" + nameLog + ", username=" + usernameLog);
if (nameLog == null || usernameLog == null || passLog == null) {
request.setAttribute("error", "All info required");
request.getRequestDispatcher("/formlog.jsp").forward(request, response);
return;
}
Cookie[] cookies = request.getCookies();
int failedAttempts= 0;
Cookie cookieAttempts = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("failedAttempts")) {
failedAttempts= Integer.parseInt(cookie.getValue());
cookieAttempts = cookie;
break;
}
}
}
if (failedAttempts>= ATTEMPTS_MAX) {
request.setAttribute("error", "Too many attempts. wait 10 seconds.");
RequestDispatcher dispatcher = request.getRequestDispatcher("/formlog.jsp");
dispatcher.forward(request, response);
return;
}
boolean correctLogin= false;
for (User user : list) {
if (user.getName().equals(nameLog) && user.getUsername().equals(usernameLog) && user.getPass().equals(passLog)) {
correctLogin= true;
break;
}
}
if (correctLogin) {
HttpSession session = request.getSession();
session.setAttribute("username", usernameLog);
if (cookieAttempts != null) {
cookieAttempts.setValue("0");
cookieAttempts.setMaxAge(0);
response.addCookie(cookieAttempts);
}
response.sendRedirect("welcome.jsp");
} else {failedAttempts++;
if (cookieAttempts== null) {
cookieAttempts= new Cookie("failedAttempts", String.valueOf(failedAttempts));
} else {
cookieAttempts.setValue(String.valueOf(failedAttempts));
}
cookieAttempts.setMaxAge(10);
response.addCookie(cookieAttempts);
request.setAttribute("error", "Incorrect user or pass. Intento " + failedAttempts+ " de " + ATTEMPTS_MAX);
RequestDispatcher dispatcher = request.getRequestDispatcher("/formlog.jsp");
dispatcher.forward(request, response);
}
}
}
当我在浏览器中执行时,我可以看到表单,但它根本不起作用。
您必须在应用程序服务器上执行此代码才能正常工作。