随机生成图片验证码

来源:互联网 发布:夏达姚非拉事件 知乎 编辑:程序博客网 时间:2024/06/05 17:37

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

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 stubdoGet(request, response);}}

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