服务器之家

服务器之家 > 正文

java生成图片验证码实例代码

时间:2020-04-17 11:54     来源/作者:lijiao

关于java图片验证码的文章最近更新了不少,帮助大家掌握java验证码的生成技术,下文为大家分享了java生成图片验证码最简单的方法,供大家参考。

现在各行业在定制系统时都会考虑到机器注册,现在最有效的方式就是输入验证。现在的验证方式有很多种:

一、问题验证,其实也是图片验证,在图片上生成问题,然后输入框输入答案。

二、图片验证,输入图片上展示的文字信息。

三、短信验证,比较繁杂,用户也不怎么喜欢。

四、还有就是百度最新的验证方式。图片上生成文字,然后出现一个文字点击框,选择你在验证图片上看到的文字。
现在就分享一下java生成验证码的代码,这是一个基础的代码。可以直接在学习中使用,如果需要较为复杂的验证可自己添加逻辑验证。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
@Controller
public class ImgVerifyCode extends HttpServlet {
 
  /**
   *
   */
  private static final long serialVersionUID = 1L;
 
  /**
   * 验证码图片的宽度。
   */
  private int width = 70;
 
  /**
   * 验证码图片的高度。
   */
  private int height =30;
 
  /**
   * 验证码字符个数
   */
  private int codeCount = 5;
 
  /**
   * xx
   */
  private int xx = 0;
 
  /**
   * 字体高度
   */
  private int fontHeight;
 
  /**
   * codeY
   */
  private int codeY;
 
  /**
   * codeSequence
   */
   String[] codeSequence = { "1" , "2" , "3" , "4" , "5" ,"6","7","8","9","A","a","B","b","c","C"
       ,"D","d","E","e","F","f","G","g","z","X","Q","v"};
 
  /**
   * 初始化验证图片属性
   */
  public void init() throws ServletException {
    // 从web.xml中获取初始信息
    // 宽度
    String strWidth =width+"";
    // 高度
    String strHeight = height+"";
    // 字符个数
    String strCodeCount = codeCount+"";
 
    // 将配置的信息转换成数值
    try {
      if (strWidth != null && strWidth.length() != 0) {
        width = Integer.parseInt(strWidth);
      }
      if (strHeight != null && strHeight.length() != 0) {
        height = Integer.parseInt(strHeight);
      }
      if (strCodeCount != null && strCodeCount.length() != 0) {
        codeCount = Integer.parseInt(strCodeCount);
      }
    } catch (NumberFormatException e) {
      e.printStackTrace();
    }
 
    xx = width / (codeCount + 2); //生成随机数的水平距离
    fontHeight = height - 12;   //生成随机数的数字高度
    codeY = height - 8;      //生成随机数的垂直距离
 
  }
 
 
  protected String images(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException,IOException {
    init();
    // 定义图像buffer
    BufferedImage buffImg = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_RGB);
    Graphics2D gd = buffImg.createGraphics();
 
    // 创建一个随机数生成器类
    Random random = new Random();
 
    // 将图像填充为白色
    gd.setColor(Color.WHITE);
    gd.fillRect(0, 0, width, height);
 
    // 创建字体,字体的大小应该根据图片的高度来定。
    Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
    // 设置字体。
    gd.setFont(font);
 
    // 画边框。
    gd.setColor(Color.BLACK);
    gd.drawRect(0, 0, width - 1, height - 1);
 
    // 随机产生4条干扰线,使图象中的认证码不易被其它程序探测到。
    gd.setColor(Color.BLACK);
    for (int i = 0; i < 4; i++) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(12);
      int yl = random.nextInt(12);
      gd.drawLine(x, y, x + xl, y + yl);
    }
 
    // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
    StringBuffer randomCode = new StringBuffer();
    int red = 0, green = 0, blue = 0;
 
    // 随机产生codeCount数字的验证码。
    for (int i = 0; i < codeCount; i++) {
      // 得到随机产生的验证码数字。
      String strRand = String.valueOf(codeSequence[random.nextInt(27)]);
      // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
      red = random.nextInt(125);
      green = random.nextInt(255);
      blue = random.nextInt(200);
 
      // 用随机产生的颜色将验证码绘制到图像中。
      gd.setColor(new Color(red, green, blue));
      gd.drawString(strRand, (i + 1) * xx, codeY);
 
      // 将产生的四个随机数组合在一起。
      randomCode.append(strRand);
    }
    // 将四位数字的验证码保存到Session中。
    HttpSession session = req.getSession();
    session.setAttribute("validateCode", randomCode.toString());
 
    // 禁止图像缓存。
    resp.setHeader("Pragma", "no-cache");
    resp.setHeader("Cache-Control", "no-cache");
    resp.setDateHeader("Expires", 0);
 
    resp.setContentType("image/jpeg");
 
    // 将图像输出到Servlet输出流中。
    ServletOutputStream sos = resp.getOutputStream();
    ImageIO.write(buffImg, "jpeg", sos);
    sos.close();
    return null;
  }
  

这个代码就是生成验证图片的基础方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,大家也可以查看之前的文章进行深入学习。

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
返回顶部