springMVC--动态验证码实现

本文介绍了一种简单的验证码生成方法,通过Java代码创建包含随机字符的图片,并将其存储在session中以供验证使用。文章提供了完整的代码示例,展示了如何设置响应头以避免缓存,以及如何绘制背景、干扰线和验证码字符。

在网站开发过程中我们一般都会为了防止用户连续提交都会提供验证码的功能,简单来说就是生成一个动态图片,在图片中保存一些校验信息,将校验信息放到session中和用户提交的验证码信息进行对比,如果出现错误则要提示验证码错误。

提供一个简单实现的demo。

  1. @Controller  
  2. @RequestMapping("/auth")  
  3. public class AuthCodeController {  
  4.       
  5.     private char[] codeSequence = { 'A''1','B''C''2','D','3''E','4''F''5','G','6''H''7','I''8','J',  
  6.             'K',   '9' ,'L''1','M',  '2','N',  'P''3''Q''4''R''S''T''U''V''W',  
  7.             'X''Y''Z'};  
  8.       
  9.     @RequestMapping("/code")  
  10.     public void getCode(HttpServletResponse response,HttpSession session) throws IOException{  
  11.         int width = 63;  
  12.         int height = 37;  
  13.         Random random = new Random();  
  14.         //设置response头信息  
  15.         //禁止缓存  
  16.         response.setHeader("Pragma""No-cache");  
  17.         response.setHeader("Cache-Control""no-cache");  
  18.         response.setDateHeader("Expires"0);  
  19.   
  20.         //生成缓冲区image类  
  21.         BufferedImage image = new BufferedImage(width, height, 1);  
  22.         //产生image类的Graphics用于绘制操作  
  23.         Graphics g = image.getGraphics();  
  24.         //Graphics类的样式  
  25.         g.setColor(this.getColor(200250));  
  26.         g.setFont(new Font("Times New Roman",0,28));  
  27.         g.fillRect(00, width, height);  
  28.         //绘制干扰线  
  29.         for(int i=0;i<40;i++){  
  30.             g.setColor(this.getColor(130200));  
  31.             int x = random.nextInt(width);  
  32.             int y = random.nextInt(height);  
  33.             int x1 = random.nextInt(12);  
  34.             int y1 = random.nextInt(12);  
  35.             g.drawLine(x, y, x + x1, y + y1);  
  36.         }  
  37.   
  38.         //绘制字符  
  39.         String strCode = "";  
  40.         for(int i=0;i<4;i++){  
  41.             String rand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);  
  42.             strCode = strCode + rand;  
  43.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
  44.             g.drawString(rand, 13*i+628);  
  45.         }  
  46.         //将字符保存到session中用于前端的验证  
  47.         session.setAttribute("authCode", strCode.toLowerCase());  
  48.         g.dispose();  
  49.   
  50.         ImageIO.write(image, "JPEG", response.getOutputStream());  
  51.         response.getOutputStream().flush();  
  52.     }  
  53.       
  54.     public  Color getColor(int fc,int bc){  
  55.         Random random = new Random();  
  56.         if(fc>255)  
  57.             fc = 255;  
  58.         if(bc>255)  
  59.             bc = 255;  
  60.         int r = fc + random.nextInt(bc - fc);  
  61.         int g = fc + random.nextInt(bc - fc);  
  62.         int b = fc + random.nextInt(bc - fc);  
  63.         return new Color(r,g,b);  
  64.     }  
  65.       
  66. }  
@Controller
@RequestMapping("/auth")
public class AuthCodeController {
    
    private char[] codeSequence = { 'A', '1','B', 'C', '2','D','3', 'E','4', 'F', '5','G','6', 'H', '7','I', '8','J',
            'K',   '9' ,'L', '1','M',  '2','N',  'P', '3', 'Q', '4', 'R', 'S', 'T', 'U', 'V', 'W',
            'X', 'Y', 'Z'};
    
    @RequestMapping("/code")
    public void getCode(HttpServletResponse response,HttpSession session) throws IOException{
        int width = 63;
        int height = 37;
        Random random = new Random();
        //设置response头信息
        //禁止缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        //生成缓冲区image类
        BufferedImage image = new BufferedImage(width, height, 1);
        //产生image类的Graphics用于绘制操作
        Graphics g = image.getGraphics();
        //Graphics类的样式
        g.setColor(this.getColor(200, 250));
        g.setFont(new Font("Times New Roman",0,28));
        g.fillRect(0, 0, width, height);
        //绘制干扰线
        for(int i=0;i<40;i++){
            g.setColor(this.getColor(130, 200));
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int x1 = random.nextInt(12);
            int y1 = random.nextInt(12);
            g.drawLine(x, y, x + x1, y + y1);
        }

        //绘制字符
        String strCode = "";
        for(int i=0;i<4;i++){
            String rand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            strCode = strCode + rand;
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
            g.drawString(rand, 13*i+6, 28);
        }
        //将字符保存到session中用于前端的验证
        session.setAttribute("authCode", strCode.toLowerCase());
        g.dispose();

        ImageIO.write(image, "JPEG", response.getOutputStream());
        response.getOutputStream().flush();
    }
    
    public  Color getColor(int fc,int bc){
        Random random = new Random();
        if(fc>255)
            fc = 255;
        if(bc>255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r,g,b);
    }
    
}
在jsp文件中请求这个图片地址

  1. <label><img type="image" src="/auth/code" id="codeImage"  style="cursor:pointer;"/></label>  
<label><img type="image" src="/auth/code" id="codeImage"  style="cursor:pointer;"/></label>
效果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值