随机生成图片验证码

在做项目的时候,我们经常也会用到随机数验证码,下面带大家一起实现验证码的绘制实现过程:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
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 javax.servlet.http.HttpSession;

/**
 * Servlet implementation class codeServlet
 */
@WebServlet("/code")
public class CodeServlet extends HttpServlet {
	//1.指定画板的长宽(即:验证码所在位置的大小)
	private int width=80;
	private int height=30;
	
	private static final long serialVersionUID = 1L;
       
    public CodeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//2.准备画板
		BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//3.准备画笔
		Graphics g=image.getGraphics();
		//4.给画笔上色
		Random ran=new Random();
		g.setColor(new Color(ran.nextInt(255), ran.nextInt(255), ran.nextInt(255)));
		//5.给画板设置背景颜色
		g.fillRect(0, 0, width, height);
		//6.获取随机的字符串
		String number=getNumber(4,ran);
		//7.将产生的Number存入session中
		HttpSession session=request.getSession();
		session.setAttribute("number", number);
		//8.绘制字符串
		//先转换画笔的颜色
		g.setColor(new Color(0,0,0));
		g.setFont(new Font(null, Font.ITALIC, 24));
		g.drawString(number, 5, 25);
		//9.绘制干扰线
		for (int i = 0; i < 8; i++) {
			g.setColor(new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));
			g.drawLine(ran.nextInt(width), ran.nextInt(height), ran.nextInt(width), ran.nextInt(height));
		}
		//10.压缩图片并输出到客户端
		response.setContentType("image/jpeg");
		OutputStream output=response.getOutputStream();
		ImageIO.write(image, "jpeg", output);
		output.close();
	}

	//获取随机字符串
	private String getNumber(int n, Random ran) {
		String number="";
		String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890qwertyuiopasdfghjklzxcvbnm";
		for(int i=0;i<n;i++){
			number+=str.charAt(ran.nextInt(str.length()));
		}
		return number;
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

我们使用的时候只需要调用对应的URL路径就能够实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SSM中,可以使用java.awt.image包中的类生成图片验证码。具体步骤如下: 1.创建验证图片缓冲区对象,设置宽度、高度和颜色模式。 2.获取Graphics对象,用于绘制验证码。 3.生成随机的验证码字符串,可以使用字母、数字或者其他字符。 4.将验证码字符串绘制在图片上,可以设置字体、字号和颜色等。 5.绘制干扰线或者干扰点,增加验证码的复杂度和安全性。 6.将图片输出到客户端,可以使用HttpServletResponse的OutputStream对象。 以下是一个简单的代码示例: ```java @RequestMapping("/captcha") public void captcha(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置响应头信息 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 创建验证图片缓冲区对象 int width = 80, height = 30; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取Graphics对象,用于绘制验证码 Graphics g = image.getGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); // 生成随机的验证码字符串 String captcha = ""; Random random = new Random(); for (int i = 0; i < 4; i++) { char c = (char) (random.nextInt(26) + 'A'); captcha += c; } // 将验证码字符串绘制在图片上 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); g.setColor(Color.BLACK); g.drawString(captcha, 15, 20); // 绘制干扰线或者干扰点 for (int i = 0; i < 10; i++) { int x1 = random.nextInt(width); int y1 = random.nextInt(height); int x2 = random.nextInt(width); int y2 = random.nextInt(height); g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g.drawLine(x1, y1, x2, y2); } // 将图片输出到客户端 response.setContentType("image/jpeg"); OutputStream out = response.getOutputStream(); ImageIO.write(image, "JPEG", out); out.flush(); out.close(); // 将验证码存储到Session中,以便验证 HttpSession session = request.getSession(); session.setAttribute("captcha", captcha); } ``` 这段代码会在访问/captcha时生成一个验证图片,并将验证码存储到Session中,以便后续验证。在前端页面中可以使用<img>标签来显示验证图片,用户输入验证码后,将用户输入的验证码与Session中存储的验证码进行比较即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值