验证码的生成



public class ValidateCodeServlet extends HttpServlet {

	private int width = 80;
	private int height = 30;
	private String validateString  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	
	private Random r = new Random();
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//验证码是图片
		//生成图片   在图片写入 字母和数字
		//生成后写入到页面中
		
		//先在内存中创建图片
		//获取session对象  将生成的验证码放入session中
		HttpSession session = request.getSession();
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//在图片上面写字母 数字  设置颜色
		//先获取画笔工具
		Graphics g = image.getGraphics();
		//给画笔设置颜色
		g.setColor(new Color(200,200,200));
		//设置画笔格式 font 第一个 格式的名字
		g.setFont(new Font("宋体", Font.ITALIC, 25));
		
		
		//画出矩形
		g.fillRect(0, 0, width, height);
		
		//在矩形中写入字母和数字
		String validateCode = drawData(g);
		//将生成的验证码放入session中 便于跟用户提交的验证码比较
		session.setAttribute("validateCode", validateCode);
		System.out.println(validateCode);
		
		//在验证码中写入线条
		drawLine(g, 50);
		
		
		
		
		
		//输出到页面
		//输出流 
		OutputStream out = response.getOutputStream();
		//图片输出的工具类
		//write  将图片通过输出流输出到页面中
		//第一个参数  输出的内容  图片
		ImageIO.write(image, "JPEG", out);
		
	}
	//画线条
	public void drawLine(Graphics g,int num){
		//用循环控制线条数目
		//每次画一条
		for(int i = 0;i<num;i++){
			//给画笔设置随机颜色
			g.setColor(getColor());
			//线条起点x的坐标
			int x1 = r.nextInt(width);
			//线条起点y的坐标
			int y1 = r.nextInt(height);
			
			int x2 = r.nextInt(10);
			int y2 = r.nextInt(10);
			
			g.drawLine(x1, y1, x1+x2,y1+y2);
			
		}
		
		
	}
	
	//写字母和数字的方法
	public String drawData(Graphics g){
		
		StringBuffer sb = new StringBuffer();
		
		//随机取 charAt(index)
		for(int i = 0;i<4;i++){
			//获取随机的下标值
			//修改画笔颜色
			g.setColor(getColor());
			int index = r.nextInt(validateString.length());
			String data = String.valueOf(validateString.charAt(index));
			
			g.drawString(data, i*15+10, 20);
			
			sb.append(data);
			
		}
		
		
		
		return sb.toString();
	}
	
	//随机获取颜色
	public Color getColor(){
		
		Color color = new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
		
		return color;
		
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值