java实现登录页面的验证码功能

落日映苍穹つ 2022-06-07 03:16 332阅读 0赞

我们访问电商网站,登录账号时。都需要验证码的输入。那么在java中,我们是如何实现验证码的呢?这里,我用servelet做个demo。

代码清单:

  1. package com.test;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.IOException;
  7. import java.util.Random;
  8. import javax.imageio.ImageIO;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import javax.servlet.ServletException;
  15. import javax.servlet.annotation.WebServlet;
  16. import javax.servlet.http.HttpServlet;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. /** * Servlet implementation class ValidateCodeServle */
  20. @WebServlet("/ValidateCodeServle")
  21. public class ValidateCodeServle extends HttpServlet {
  22. private static final long serialVersionUID = 1L;
  23. /** * @see HttpServlet#HttpServlet() */
  24. public ValidateCodeServle() {
  25. super();
  26. // TODO Auto-generated constructor stub
  27. }
  28. /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
  29. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  30. // TODO Auto-generated method stub
  31. doPost(request, response);
  32. }
  33. /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  34. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  35. // 响应头信息
  36. response.setHeader("Pragma", "No-Cache");
  37. response.setHeader("Cache-Control", "no-cache");
  38. response.setDateHeader("Expries", 0);
  39. // 随机数生成类
  40. Random random = new Random();
  41. // 定义验证码的位数
  42. int size = 5;
  43. // 定义变量保存生成的验证码
  44. String vCode = "";
  45. char c;
  46. // 产生验证码
  47. for (int i = 0; i < size; i++) {
  48. // 产生一个26以内的随机整数
  49. int number = random.nextInt(26);
  50. // 如果生成的是偶数,则随机生成一个数字
  51. if (number % 2 == 0) {
  52. c = (char) ('0' + (char) ((int) (Math.random() * 10)));
  53. // 如果生成的是奇数,则随机生成一个字母
  54. } else {
  55. c = (char) ((char) ((int) (Math.random() * 26)) + 'A');
  56. }
  57. vCode = vCode + c;
  58. }
  59. // 保存生成的5位验证码
  60. request.getSession().setAttribute("vCode", vCode);
  61. // 验证码图片的生成
  62. // 定义图片的宽度和高度
  63. int width = (int) Math.ceil(size * 20);
  64. int height = 30;
  65. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  66. // 获取图片的上下文
  67. Graphics gr = image.getGraphics();
  68. // 设定图片背景颜色
  69. gr.setColor(Color.WHITE);
  70. gr.fillRect(0, 0, width, height);
  71. // 设定图片边框
  72. gr.setColor(Color.GRAY);
  73. gr.drawRect(0, 0, width - 1, height - 1);
  74. // 画十条干扰线
  75. for (int i = 0; i < 5; i++) {
  76. int x1 = random.nextInt(width);
  77. int y1 = random.nextInt(height);
  78. int x2 = random.nextInt(width);
  79. int y2 = random.nextInt(height);
  80. gr.setColor(randomColor());
  81. gr.drawLine(x1, y1, x2, y2);
  82. }
  83. // 设置字体,画验证码
  84. gr.setColor(randomColor());
  85. gr.setFont(randomFont());
  86. gr.drawString(vCode, 10, 22);
  87. // 图像生效
  88. gr.dispose();
  89. // 输出到页面
  90. ImageIO.write(image, "JPEG", response.getOutputStream());
  91. }
  92. // 生成随机的颜色
  93. private Color randomColor() {
  94. int red = r.nextInt(150);
  95. int green = r.nextInt(150);
  96. int blue = r.nextInt(150);
  97. return new Color(red, green, blue);
  98. }
  99. private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
  100. private Random r = new Random();
  101. // 生成随机的字体
  102. private Font randomFont() {
  103. int index = r.nextInt(fontNames.length);
  104. String fontName = fontNames[index];// 生成随机的字体名称
  105. int style = r.nextInt(4);
  106. int size = r.nextInt(3) + 24; // 生成随机字号, 24 ~ 28
  107. return new Font(fontName, style, size);
  108. }
  109. }

测试:
这里写图片描述

这里写图片描述

发表评论

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

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

相关阅读