验证码登录练习
需求:1.创建一个登录页面,要求客户输入账户,密码和验证码,点击注册后都正确则跳转到成功登录页面,页面输出“欢迎XXX重新访问网站”,验证码错误则在登录页面输出“验证码错误!”,账户或密码错误则输出“登录失败,用户名或密码错误!”
第一步:创建用户类,工具类以及查询数据库类,还有验证码的动态Servlet,在我的上一篇文章有相关记录请查询。
第二步:登录的主页login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<script>
window.onload = function () {
document.getElementById("ckcode").onclick = function () {
var date = new Date();
var time = date.getTime();
this.src = "/Servlet111?" + time;
}
}
</script>
</head>
<style>
div {
color: red;
}
</style>
<body>
<form action="/login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" placeholder="请输入用户名" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="text" placeholder="请输入密码" name="password"></td>
</tr>
<tr>
<td>验证码</td>
<td><input type="text" placeholder="请输入验证码" name="checkcode"></td>
</tr>
<tr>
<td colspan="2">
<img src="/Servlet111" id="ckcode">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="注册">
</td>
</tr>
</table>
</form>
<div>
<%=request.getAttribute("cc_erro")==null?"":request.getAttribute("cc_erro")%>
</div>
<div>
<%=request.getAttribute("user_erro")==null?"":request.getAttribute("user_erro")%>
</div>
</body>
</html>
第二步:登录的Servlet创建
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/login")
public class login extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置request编码
request.setCharacterEncoding("utf-8");
//获取请求参数Map集合
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println(parameterMap);
//可以利用BeanUtils来简化操作
user user = new user();
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
String checkcode = request.getParameter("checkcode");
//判断验证码是否正确?
HttpSession session = request.getSession();
String check_code = (String) session.getAttribute("check_code");//强制转型为String才能使用
//删除验证码
// session.removeAttribute("check_code");
if (check_code.equalsIgnoreCase(checkcode)) {
//如果验证码正确 则利用userdao查询数据库验证用户名和密码是否正确
userdao userdao = new userdao();
cn.web.user loginuser = userdao.login(user);
if (loginuser == null) {
//用户名或者密码错误 转发
request.setAttribute("user_erro", "用户名或密码错误!请重新输入");
request.getRequestDispatcher("/login.jsp").forward(request, response);
} else {
//用户名密码正确 则存储信息到session并重定向(因为两次请求必须用session)
session.setAttribute("username", user.getUsername());
//重定向
response.sendRedirect(request.getContextPath() + "/success.jsp");
}
} else {
//如果验证码错误,转发
request.setAttribute("cc_erro", "验证码错误!请重新输入!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
第三步:登录成功后的页面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎<%=request.getSession().getAttribute("username")%>重新访问网站!</h1>
</body>
</html>
备注:
在验证码的代码里,将验证码随机数利用StringBuilder存储到session中,然后在login的servlet里将验证码随机数再取出来与用户输入的验证码对比匹配得到结果。
注意,如果验证码无需大小写,则使用equalsIgnoreCase.()忽略大小写匹配方法。