servlet生产唯一图片验证码

系统 1765 0
参考了几篇文章,写了个用servlet生产唯一验证码(改造了原作者代码,在此致谢,后附链接)。附件是可直接使用的工程。明天试用一个开源项目,可以比较方便的生成各种风格的验证码,甚至还有声音,比较有意思。第一次记录自己的学习,以后争取每天写一点。
===================================================
    
package com.stone.study.validate;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ImgValidateServlet2 extends HttpServlet {
	private static int WIDTH = 90;
    private static int HEIGHT = 20;
    private static int LENGTH = 6;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 HttpSession session = request.getSession();

         response.setContentType("image/jpeg");

         ServletOutputStream sos = response.getOutputStream();

         //设置浏览器不要缓存此图片
         response.setHeader("Pragma","No-cache");
         response.setHeader("Cache-Control","no-cache");
         response.setDateHeader("Expires", 0);

         //创建内存图象并获得其图形上下文
         BufferedImage image = 
                new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 

         Graphics g = image.getGraphics();

         //产生随机的认证码
         char [] rands = generateCheckCode();

         //产生图像
         drawBackground(g);

         drawRands(g,rands);

         //结束图像的绘制过程,完成图像
         g.dispose();

         //将图像输出到客户端
         ByteArrayOutputStream bos = new ByteArrayOutputStream();

         ImageIO.write(image, "JPEG", bos);

         byte [] buf = bos.toByteArray();

         response.setContentLength(buf.length);

         //下面的语句也可写成:bos.writeTo(sos);
         sos.write(buf);
         bos.close();
         sos.close();

         //将当前验证码存入到Session或者数据库中,下一个表单处理中验证客户端提交的验证码是否正确
         session.setAttribute("check_code",new String(rands));
	}

	private static char [] generateCheckCode()
    {
       //定义验证码的字符表
       String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

       char [] rands = new char[LENGTH];
       for(int i=0; i<LENGTH; i++)

       {
          int rand = (int)(Math.random() * 36);
          rands[i] = chars.charAt(rand);
       }

       return rands;
    }
	
	   private void drawRands(Graphics g , char [] rands) 
       {
          g.setColor(Color.BLACK);
          g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

          //在不同的高度上输出验证码的每个字符         
          g.drawString("" + rands[0],1,17);
          g.drawString("" + rands[1],16,15);
          g.drawString("" + rands[2],31,18);
          g.drawString("" + rands[3],46,16);
          g.drawString("" + rands[4],61,14);
          g.drawString("" + rands[5],76,19);

          System.out.println(rands);
       }

       private void drawBackground(Graphics g)

       {
           //画背景
          g.setColor(new Color(0xDCDCDC));
          g.fillRect(0, 0, WIDTH, HEIGHT);

          //随机产生120个干扰点
          for(int i=0; i<120; i++)

          {
             int x = (int)(Math.random() * WIDTH);

             int y = (int)(Math.random() * HEIGHT);

             int red = (int)(Math.random() * 255);

             int green = (int)(Math.random() * 255);

             int blue = (int)(Math.random() * 255);

             g.setColor(new Color(red,green,blue));        

             g.drawOval(x,y,1,0);

          }
          
          //加两条干扰线
          g.drawLine(0, 5, 90, 5);
          g.drawLine(0, 15, 90, 15);

       }

       public static void main(String args[]) {
    	   char[] chars = generateCheckCode();

    	   System.out.println(chars);
       }
}


  


代码出处:《深入体验Java Web开发内幕——核心基础》

servlet生产唯一图片验证码


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论