本文实例为大家分享了java实现图片验证码的具体代码,供大家参考,具体内容如下
目的:
1) 验证操作者是否是人
2) 防止表单重复提交
生成验证码的要点:
1) 使用java代码生成图片对象
BufferedImage
2) 使用Random生成随机字符串
3) 将图片对象用
ImageIO.write(图片对象, "jpeg|png", 响应字节输出流)
返回给客户端浏览器
验证验证码:
要点:
1) 将验证码文字存入session作用域
2) 表单提交时,对比session中的验证码和表单中的验证码
CaptchaUtils.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
|
package cn.seeker.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.*; import java.util.List; public class CaptchaUtil { public static String [] fuhao = { "+" , "-" , "*" , "/" }; public static int num = 0 ; //生成随机算式 public static String random(){ List list = new ArrayList(); Random ran = new Random(); int n1 = ran.nextInt( 10 ); int n2 = ran.nextInt( 10 ); String f = fuhao[ran.nextInt(fuhao.length)]; StringBuilder sb = new StringBuilder( 4 ); switch (f){ case "+" : num = n1+n2; break ; case "-" : num =n1-n2; break ; case "*" : num = n1*n2; break ; case "/" : if (n2 == 0 ){ n2 = ran.nextInt( 10 )+ 1 ; num = n1/n2; } else { num = n1/n2; } break ; } sb.append(n1); sb.append(f); sb.append(n2); sb.append( "=" ); return sb.toString(); } public static void outputImage(String str, OutputStream os){ Random ran = new Random(); //创建图片对象 BufferedImage img = new BufferedImage( 100 , 40 , BufferedImage.TYPE_INT_RGB); //获取画布 Graphics g = img.getGraphics(); //设置背景 g.setColor(Color.white); g.fillRect( 0 , 0 , 100 , 40 ); //写字 g.setColor(Color.black); g.setFont( new Font( "微软雅黑" ,Font.PLAIN, 30 )); g.drawString(str, 10 , 40 ); //随机三条线 g.drawLine(ran.nextInt( 100 ),ran.nextInt( 40 ), ran.nextInt( 100 ),ran.nextInt( 40 )); g.drawLine(ran.nextInt( 100 ),ran.nextInt( 40 ), ran.nextInt( 100 ),ran.nextInt( 40 )); g.drawLine(ran.nextInt( 100 ),ran.nextInt( 40 ), ran.nextInt( 100 ),ran.nextInt( 40 )); // 4. 输出结果 // 常见的压缩格式:jpeg(有损压缩), png(无损压缩) ... try { ImageIO.write(img, "png" , os); } catch (IOException e) { e.printStackTrace(); } } } |
regist.jsp
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
|
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2018/10/14 Time: 15:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> < html > < head > < title >注册</ title > < style > img { cursor: pointer} </ style > </ head > < body > < form action = "/regist" method = "post" > < img src = "/captcha.png" onclick = "changeImg(this)" > 输入验证码:< input type = "text" name = "cap" > < input type = "submit" value = "提交" > </ form > < script > function changeImg(img) { // 浏览器有一个缓存特性, // 第一次从服务器获取图片,浏览器第二次发送请求时发现地址没有改变,就会使用第一次的图片,而不会真正发送请求 // 为了让浏览器每次都把请求发送给服务器,给一个时间参数 img.src = "/captcha.png?t="+new Date().getTime(); // 给src赋一个新值,就会向新值的地址发送一次请求 } </ script > </ body > </ html > |
CaptchaServlet.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
|
package cn.seeker.controller; import cn.seeker.utils.CaptchaUtil; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet (urlPatterns = "/captcha.png" ) public class CaptchaServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "image/png" ); //获取随机字符串 String random = CaptchaUtil.random(); //输出图片 CaptchaUtil.outputImage(random,response.getOutputStream()); //存入结果 request.getSession().setAttribute( "res" ,CaptchaUtil.num); } } |
registServlet.jsp
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
|
package cn.seeker.controller; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet (urlPatterns = "/regist" ) public class registServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String cap = req.getParameter( "cap" ); Integer res = (Integer)req.getSession().getAttribute( "res" ); if (Integer.parseInt(cap) == res) { // 填写正确,注册成功 req.getSession().removeAttribute( "res" ); System.out.println( "注册成功" ); resp.sendRedirect( "/index.jsp" ); } else { req.setAttribute( "error" , "验证码不正确" ); req.getRequestDispatcher( "/jsp/regist.jsp" ).forward(req,resp); } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_38454165/article/details/83097420