Servlet制作验证码
1.什么是验证码(CAPTCHA):
验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。它可以防止计算机执行一些操作。
验证码是很多网站通行的方式,本文利用简易的方式实现了这个功能。
2.为什么要使用验证码:
没使用验证码的问题:不断登陆破解密码,创建垃圾账户,刷票,提交垃圾信息。通过验证码,由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。
3.使用Servlet制作验证码:
4.具体代码实现:
ImageServlet:主要用到了BufferedImage类
JSP页面:package com.tom.servlet; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ImageServlet extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{ BufferedImage bi = new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);//建立一个缓冲区存 放图片,三个参数分别为 长,宽,颜色类型。 Graphics g = bi.getGraphics();//获取图片 Color c = new Color(200,150,255);//创建颜色 g.setColor(c);//设置背景颜色 g.fillRect(0, 0, 68, 22);//在(0,0)绘制图形 char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//验证码展现字符数组 Random rd = new Random(); StringBuffer sb = new StringBuffer(); int rdRange = ch.length,index; for(int i=0; i<4; i++){ index = rd.nextInt(rdRange);//通过产生随机数随机选定显示字符 g.setColor(new Color(rd.nextInt(88),rd.nextInt(188),rd.nextInt(240))); g.drawString(ch[index]+"",(i*15)+3 , 18); sb.append(ch[index]); } request.getSession().setAttribute("picCode", sb.toString());//将验证码写入Session ImageIO.write(bi, "JPG", response.getOutputStream());//输出 } }验证码验证LoginServlet:<html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript"> function reloadCode(){ var time = new Date().getTime(); document.getElementById("imageCode").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time; }//实现点击“看不清”的方法——这里需要注意的是,IE浏览器对于同一个请求路径,默认是不去请求新的资源的,他会到缓存中去拿对应的内容,解决的方法就是给请求的路径加一个随机数,让IE适中认为这是一个新的请求。本文中是加个时间。 </script> </head> <body> <form action="<%=request.getContextPath()%>/servlet/LoginServlet" method="get"> 验证码:<input id="checkCode" name="checkCode" type="text"> <img alt="验证码" id="imageCode" src="<%=request.getContextPath()%>/servlet/ImageServlet"> <a href="javascript:reloadCode();">看不清楚</a><br> <input type="submit" value="提交"> </body> </form> </html>package com.tom.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 验证码验证 * @author LGQ * @date 2016年11月22日 */ public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String picCode = (String)request.getSession().getAttribute("picCode"); String checkCode = request.getParameter("checkCode").toUpperCase(); response.setContentType("text/html;charset=UTF-8");//设置输出格式 PrintWriter out = response.getWriter(); if(picCode.equals(checkCode)){ out.print("验证码输入正确"); }else{ out.print("验证码输入错误"); } out.flush();//输出流刷新 out.close();//输出流资源关闭 } }
5.总结:
以上就是简单实现Servlet制作验证码的步骤,如果有错误,请联系我。
也可以使用开源组件来实现:
*Jcaptcha:一个用来生成图形验证码的Java开源组件,使用起来也是非常的简单方便。与Spring组合使用,可产生多种形式的验证码。*Kaptcha:一个非常实用的验证码生成工具,有了它,你可以生成各式各样的验证码,因为它是可配置的。
即便一周都是阴天
也坚信明天的阳光
本文介绍了验证码(CAPTCHA)的基本概念,解释了为何需要验证码,并详细讲述了如何利用Servlet创建验证码。主要内容包括Servlet验证码的代码实现,重点是ImageServlet,它利用BufferedImage类生成验证码。文章最后提到了使用开源组件作为替代方案。

1448

被折叠的 条评论
为什么被折叠?



