JSP/Servlet||cms生成验证码示例

迷南。 2021-10-30 07:56 439阅读 0赞

具体解析看代码注释

需要一个CheckCodeServlet完成下面的功能

  • 创建一个生成随机数的方法

    //生成随机数据的函数
    private int generRandomInt(int start,int range){

    1. return new Random().nextInt(range - start) + start;

    }

  • 服务器端随机生成验证码

    //随机生成验证码

    1. //创建一个包含所有我们的随机验证码中要出现的字符的字符串
    2. String str = "abcdefghijklmnopqrstuvwxyz0123456789";
    3. //获取这个串的长度
    4. int len = str.length();
    5. //创建一个字符列表,存验证码
    6. ArrayList<String> cs = new ArrayList<>() ;
    7. for (int i = 0 ; i < 4 ; i++) {
    8. //生成一个0 - len之间的随机数
    9. int index = generRandomInt(0,len);
    10. // 获取随机的字符
    11. char c = str.charAt(index);
    12. // 追加进字符列表
    13. cs.add(String.valueOf(c));
    14. }
  • 验证码存入Session

    //存入session
    request.getSession().setAttribute(“checkcode”,cs);

  • 生成验证码图片

    //生成验证码图片

    1. //生成图片缓存
    2. BufferedImage img = new BufferedImage(44,20,BufferedImage.TYPE_INT_ARGB);
    3. //拿到画笔 Graphics
    4. Graphics2D g2 = (Graphics2D) img.getGraphics();
    5. //设置画笔前景色
    6. g2.setColor(Color.WHITE);
    7. // 因为缓存默认背景是黑色,改图片背景白色
    8. g2.fillRect(0,0,44,20);
    9. //字符的初始偏移量
    10. int offset = 5;
    11. // 字符战胜的宽度
    12. int width = 8;
    13. //生成位置
    14. int x = offset;
    15. int y = 18;
    16. // 在白色背景上画出验证码
    17. for(int i = 0 ; i < 4 ; i++){
    18. //先要把前景改为其它颜色
    19. //随机生成红绿兰透明度四个值,每个是0-255之间的随机数
    20. int r = generRandomInt(0,100);
    21. int g = generRandomInt(0,100);
    22. int b = generRandomInt(0,100);
    23. int a = 255;generRandomInt(0,100);
    24. Color c = new Color(r,g,b,a);
    25. //把前景色设置成随机的色彩
    26. g2.setColor(c);
    27. //画字符
    28. g2.drawString(cs.get(i),x + (width * i),y);
    29. }

    //设置mime类型

    1. response.setContentType("image/png");
    2. //生成图片并写到客户端
    3. ImageIO.write(img,"png",response.getOutputStream());

实现的完整代码:

  1. import javax.imageio.ImageIO;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.awt.*;
  8. import java.awt.image.BufferedImage;
  9. import java.io.IOException;
  10. import java.util.ArrayList;
  11. import java.util.Random;
  12. //生成验证码,响应给客户端
  13. @WebServlet(name = "CheckCodeServlet",urlPatterns = "/backend/images/checkcodes.png")
  14. public class CheckCodeServlet extends HttpServlet {
  15. //生成随机数据的函数
  16. private int generRandomInt(int start,int range){
  17. return new Random().nextInt(range - start) + start;
  18. }
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. //随机生成验证码
  21. //创建一个包含所有我们的随机验证码中要出现的字符的字符串
  22. String str = "abcdefghijklmnopqrstuvwxyz0123456789";
  23. //获取这个串的长度
  24. int len = str.length();
  25. //创建一个字符列表,存验证码
  26. ArrayList<String> cs = new ArrayList<>() ;
  27. for (int i = 0 ; i < 4 ; i++) {
  28. //生成一个0 - len之间的随机数
  29. int index = generRandomInt(0,len);
  30. // 获取随机的字符
  31. char c = str.charAt(index);
  32. // 追加进字符列表
  33. cs.add(String.valueOf(c));
  34. }
  35. //存入session
  36. request.getSession().setAttribute("checkcode",cs);
  37. //生成验证码图片
  38. //生成图片缓存
  39. BufferedImage img = new BufferedImage(44,20,BufferedImage.TYPE_INT_ARGB);
  40. //拿到画笔 Graphics
  41. Graphics2D g2 = (Graphics2D) img.getGraphics();
  42. //设置画笔前景色
  43. g2.setColor(Color.WHITE);
  44. // 因为缓存默认背景是黑色,改图片背景白色
  45. g2.fillRect(0,0,44,20);
  46. //字符的初始偏移量
  47. int offset = 5;
  48. // 字符战胜的宽度
  49. int width = 8;
  50. //生成位置
  51. int x = offset;
  52. int y = 18;
  53. // 在白色背景上画出验证码
  54. for(int i = 0 ; i < 4 ; i++){
  55. //先要把前景改为其它颜色
  56. //随机生成红绿兰透明度四个值,每个是0-255之间的随机数
  57. int r = generRandomInt(0,100);
  58. int g = generRandomInt(0,100);
  59. int b = generRandomInt(0,100);
  60. int a = 255;generRandomInt(0,100);
  61. Color c = new Color(r,g,b,a);
  62. //把前景色设置成随机的色彩
  63. g2.setColor(c);
  64. //画字符
  65. g2.drawString(cs.get(i),x + (width * i),y);
  66. }
  67. //设置mime类型
  68. response.setContentType("image/png");
  69. //生成图片并写到客户端
  70. ImageIO.write(img,"png",response.getOutputStream());
  71. }
  72. }

注意,我们上面示例的路径/backend/images/checkcodes.png 所以,我们要在所设定的jsp文件里增加路径,这个根据读者的项目,合理引用,这里这是提供一个可以实现生成验证码的示例

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pvY2tMaXU_size_16_color_FFFFFF_t_70

测试页面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pvY2tMaXU_size_16_color_FFFFFF_t_70 1

发表评论

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

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

相关阅读

    相关 验证生成

    视图函数里 > 1,导入图片,画布,画笔,画笔上的字体,定义坐标 > 2,从外部导入字体(字体导入到static静态中) > 3,随机生成验证码,验证码颜色,验证