手把手教你实现验证码功能

迷南。 2022-11-22 02:49 344阅读 0赞

前言

不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

实现方式

1)手写验证码

  1. /** * 第一种生成验证码的方式 */
  2. @WebServlet("/CheckCodeServlet")
  3. public class CheckCodeServlet extends HttpServlet {
  4. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. //声明两个变量存验证码的宽高
  6. int width=120;
  7. int height=40;
  8. //创建内存图像对象
  9. BufferedImage bimg=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  10. //获得图像的画笔
  11. Graphics gp=bimg.getGraphics();
  12. //设置画笔颜色
  13. gp.setColor(Color.blue);
  14. //填充图像的背景颜色
  15. gp.fillRect(0, 0, width, height);
  16. //设置画笔颜色
  17. gp.setColor(Color.YELLOW);
  18. //设置画笔的字体
  19. gp.setFont(new Font("宋体", Font.BOLD, 30));
  20. //声明一个数组存可能作为验证码的字符
  21. String[] s1= { "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e"};
  22. //声明字符串存验证码
  23. StringBuffer sb=new StringBuffer();
  24. //循环生成四个验证码
  25. for (int i = 0; i <4; i++) {
  26. int index=(int)(Math.random()*s1.length);
  27. //生成的验证码字母为
  28. String code1=s1[index];
  29. //将生成的验证码写入到图像上
  30. gp.drawString(code1, i*20+10, 30);
  31. //将每次生成的字母存到sb中
  32. sb.append(code1);
  33. }
  34. //存储生成的验证码,用于登录时做校验
  35. request.getSession().setAttribute("checkcode", sb);
  36. //在图像画干扰线
  37. //设置画笔颜色
  38. gp.setColor(Color.red);
  39. for (int i = 0; i < 10; i++) {
  40. gp.drawLine((int)(Math.random()*width), (int)(Math.random()*height), (int)(Math.random()*width), (int)(Math.random()*height));
  41. }
  42. //将生成的验证写到客户端
  43. ImageIO.write(bimg, "jpg", response.getOutputStream());
  44. }

2)验证码工具类

——ValidateCode.jar

  1. /** * 第二种生成验证码的方式 */
  2. @WebServlet("/CheckCodeServlet")
  3. public class CheckCodeServlet extends HttpServlet {
  4. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. //声明变量存储验证码宽度,高度,验证码的字母个数,验证码的干扰线的条数
  6. int width=120;
  7. int height=40;
  8. int count=4;
  9. int lineCount=20;
  10. //创建验证码对象
  11. ValidateCode vc=new ValidateCode(width, height, count, lineCount);
  12. //获取验证码
  13. String code1=vc.getCode();
  14. //System.out.println("生成的验证码:"+code1);
  15. //将生成的验证码存到Session会话
  16. request.getSession().setAttribute("checkcode", code1);
  17. //将生成的验证码返回给客户端
  18. vc.write(response.getOutputStream());
  19. }
  20. }

页面主要代码

  1. <script type="text/javascript"> function changeImg() { // 时间戳 // 为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳 document.getElementById("imgObj").src="CheckCodeServlet?r="+new Date(); } </script>
  2. <form action="${pageContext.request.contextPath}/checkCode" method="post">
  3. 请输入验证码:<input type="text" name="code" style="width: 80px;" />
  4. <img id="imgObj" alt="验证码" src="${pageContext.request.contextPath}/checkCodeServlet"><a href="#" onclick="changeImg()">换一张</a><br/>
  5. <input type="submit" value="提交" />
  6. </form>

效果图

1、手写效果
在这里插入图片描述
2、工具类效果
在这里插入图片描述
不喜勿喷!!!感兴趣的朋友可以试试,有疑问的欢迎在下方评论。

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读

    相关 手把手验证检验的登录

    在网站实际应用过程中,为了防止网站登录接口被机器人轻易地使用,产生一些没有意义的用户数据,所以,采用验证码进行一定程度上的拦截,当然,我们采用的还是一个数字与字母结合的图片验证

    相关 手把手实现验证功能

    前言 不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR