
验证码案例实现
发布日期:2021-05-07 19:41:39
浏览次数:26
分类:原创文章
本文共 5528 字,大约阅读时间需要 18 分钟。
文章目录
一、需求分析
(1)访问带有验证码的登录页面login.jsp(2)用户输入用户名,密码以及验证码。 * 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误 * 如果验证码输入有误,跳转登录页面,提示:验证码错误 * 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
二、代码实现
1. login.jsp
<html><head> <title>Login</title> <script> onload = function () { document.getElementById("img").onclick = function () { this.src = "/checkCodeServlet?time=" + new Date().getTime(); } } </script> <style> div{ color: red; } </style></head><body><form action="/loginServlet" method="post"> <table align="center"> <tr> <td>用户名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"></td> </tr> <tr> <td>验证码</td> <td><input type="text" name="checkCode"></td> </tr> <tr> <td colspan="2"><img id="img" src="/checkCodeServlet"></td> </tr> <tr> <td colspan="2"><input type="submit" value="登录"></td> </tr> </table></form><%--通过三目运算符输出返回的错误信息--%><div> <%=request.getAttribute("cc_error") == null ?"":request.getAttribute("cc_error")%></div><div> <%=request.getAttribute("login_error") == null ?"":request.getAttribute("login_error")%></div></body></html>
2. loginServlet.java
@WebServlet("/loginServlet")public class loginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 设置 request 编码 request.setCharacterEncoding("utf-8");// 2. 获取参数使用Map获取所有的参数 Map<String, String[]> map = request.getParameterMap();// 3. 创建 User 对象 User user = new User();// 使用 BeanUtils 进行封装 try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }// 4. 获取生成的验证码 HttpSession session = request.getSession(); String chechkCode_session = String.valueOf(session.getAttribute("checkCode_session"));// 获取之后就删除本次的验证码,防止回退操作导致验证码不改变登录成功 session.removeAttribute("checkCode_session");// 5. 判断验证码的正确性,忽略大小写,依次判断用户名,密码是否一致 if (chechkCode_session != null && chechkCode_session.equalsIgnoreCase(user.getCheckCode())){ System.out.println("user :" + user);// 调用 UserDao 的 login 方法判断用户名密码是否对应数据库中的值 UserDao userDao = new UserDao(); User login = userDao.login(user); if (login == null){ // 登录失败,存储提示信息到 request request.setAttribute("login_err","用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request,response); }else { System.out.println("登录成功 !!!");// 登录成功,存储信息,重定向到 success.jsp session.setAttribute("user",login.getUsername());// 重定向到 success.jsp response.sendRedirect(request.getContextPath() + "/success.jsp"); } }else { // 验证码不一致,存储信息到 request request.setAttribute("cc_error","验证码错误!!!");// 转发到登录页面 request.getRequestDispatcher("/login.jsp").forward(request,response); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); }}
3. CheckCodeServlet.java
@WebServlet("/checkCodeServlet")public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int width = 100; int height = 50; //1.创建一对象,在内存中图片(验证码图片对象) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //2.美化图片 //2.1 填充背景色 Graphics g = image.getGraphics();//画笔对象 g.setColor(Color.PINK);//设置画笔颜色 g.fillRect(0,0,width,height); //2.2画边框 g.setColor(Color.BLUE); g.drawRect(0,0,width - 1,height - 1); String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789"; //生成随机角标 Random ran = new Random(); StringBuffer stringBuffer = new StringBuffer();//添加字符串 for (int i = 1; i <= 4; i++) { int index = ran.nextInt(str.length()); //获取字符 char ch = str.charAt(index);//随机字符 stringBuffer.append(ch); //2.3写验证码 g.drawString(ch+"",width/5*i,height/2); }// 将验证码写入 session String checkCode_session = stringBuffer.toString(); request.getSession().setAttribute("checkCode_session",checkCode_session); //2.4画干扰线 g.setColor(Color.GREEN); //随机生成坐标点 for (int i = 0; i < 10; i++) { int x1 = ran.nextInt(width); int x2 = ran.nextInt(width); int y1 = ran.nextInt(height); int y2 = ran.nextInt(height); g.drawLine(x1,y1,x2,y2); } //3.将图片输出到页面展示 ImageIO.write(image,"jpg",response.getOutputStream()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); }}
4. 其他代码
success.jsp
<body><h1> <%=request.getSession().getAttribute("user")%>,欢迎访问!!!</h1></body>
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月21日 20时53分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(3.28-4.3)
2021-05-09
上周热点回顾(5.2-5.8)
2021-05-09
上周热点回顾(5.9-5.15)
2021-05-09
上周热点回顾(8.8-8.14)
2021-05-09
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2021-05-09
上周热点回顾(1.16-1.22)
2021-05-09
上周热点回顾(1.23-1.29)
2021-05-09
上周热点回顾(3.20-3.26)
2021-05-09
上周热点回顾(4.24-4.30)
2021-05-09
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2021-05-09
上周热点回顾(5.1-5.7)
2021-05-09
上周热点回顾(5.29-6.4)
2021-05-09
上周热点回顾(6.19-6.25)
2021-05-09
云计算之路-阿里云上:docker swarm 集群故障与异常
2021-05-09
上周热点回顾(2.19-2.25)
2021-05-09
云计算之路-阿里云上:博客web服务器轮番CPU 100%
2021-05-09
云计算之路-阿里云上:服务器CPU 100%问题是memcached连接数限制引起的
2021-05-09
上周热点回顾(3.26-4.1)
2021-05-09
故障公告:IIS应用程序池停止工作造成博客站点无法访问
2021-05-09