javaweb之图片验证码功能

javaweb之图片验证码功能

1.图片验证码生成类

直接拷贝到自己的项目即可

@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet{

	private int width = 80;
	private int height = 30;
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// step1: 使用画笔画出一张验证码图片
		// 1. 创建一个图片对象(可当作一个空白画布)
		BufferedImage image = 
				new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB );
		// 2. 获得画笔
		Graphics g = image.getGraphics();
		// 3. 给画笔设置一个随机色
		Random r = new Random();
		Color c = new Color( 155+r.nextInt(100), 
				155+r.nextInt(100), 155+r.nextInt(100) );
		g.setColor( c );
		// 4. 给图片画一个背景颜色
		g.fillRect(0, 0, width, height);
		
		// 5. 画随机数
		//String number = r.nextInt(99999) + "";
		/*
		String number = getNumber(5);
		g.setColor( Color.BLACK );
		g.setFont( new Font(null, 
				Font.BOLD | Font.ITALIC, 20) );
		g.drawString( number, 5, 24 );
		*/
		// 设置每个字符的字体
		String number = getNumber(5);
		for( int i=0; i<5; i++ ){
			char ch = number.charAt(i);
			
			// 设置一个随机颜色
			c = new Color( r.nextInt(155), r.nextInt(155), r.nextInt(155) );
			g.setColor( c );
			
			// 设置一个随机字体
			int h = (int)(10+20*Math.random());
			g.setFont( new Font(null, 
					Font.BOLD | Font.ITALIC, h) );
			// 设置字符画在画布中随机高度的位置(整个图片高度是30)
			g.drawString( ""+ch, width/5*i, h);
		}
		
		// 6. 加一些干扰线
		g.setColor(Color.black);
		for( int i=0; i<10; i++ ){
			g.drawLine( r.nextInt(80), r.nextInt(30),
						r.nextInt(80), r.nextInt(30) );
		}
		
		// 7.============== 将随机验证码绑定到session对象中==================
		HttpSession session = request.getSession();
		session.setAttribute("number", number);
		System.out.println("验证码:" + number);
		
		// step2:将动态生成的图片压缩后输出到浏览器
		// 1. 设置Content-type消息头,告诉浏览器数据是
		//		一张jpeg格式的图片
		response.setContentType("image/jpeg"); // text/html

		// 2.===========获得响应的字节输出流(要输出的是图片)===========
		OutputStream os = response.getOutputStream();

		// 3. 将原始图片按照指定压缩格式jpeg进行压缩,
		//  然后将压缩后生成的数据通过os输出到response对象上。
		//  服务器会从response对象上取出数据,打包发送给浏览器
		ImageIO.write(image, "jpeg", os);
		os.close();
	}

	/** 返回一个字符串,长度是参数size决定,随机字符a-zA-Z0-9 */
	private String getNumber(int size) {
		String str = "abcdefhjkmnprstuvwxyABCDEFGHJKLMN"
				+ "PQRSTUVWXY3456789";
		
		StringBuilder buf = new StringBuilder();
		Random r = new Random();
		for (int i = 0; i < size; i++) {
			int index = r.nextInt( str.length() );
			char c = str.charAt(index);
			buf.append( c );
		}
		return buf.toString();
	}
	
}

2.将图片响应给页面

<p>
<img src="checkCode" alt="" id="img1"
    onclick="this.src='checkCode?'+Math.random()">
    <a href="javascript:;" 
    onclick="document.getElementById('img1').src='checkCode?'+Math.random()">看不清</a>
</p>

3.结果

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值