博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springMVC--动态验证码实现
阅读量:7040 次
发布时间:2019-06-28

本文共 4343 字,大约阅读时间需要 14 分钟。

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

提供一个简单实现的demo。

[java]
  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文件中请求这个图片地址

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

转载地址:http://xjxal.baihongyu.com/

你可能感兴趣的文章
Android第五课 编译错误分析
查看>>
VS_远程调试
查看>>
博为峰Java技术题 ——JavaSE Java实现在不同编码之间进行文件转换
查看>>
Throws与Throw
查看>>
php趣味编程 - php求黑色星期五
查看>>
zabbix安装
查看>>
ELK之权限管理
查看>>
×_7_12_2013 I: Light on or off
查看>>
JIT
查看>>
巧用escalations限制Nagios报警次数 - [Nagios
查看>>
Entity SQL与LINQ TO Entity的本质区别
查看>>
python unittest 深入failfast及实际应用【示例】
查看>>
MSSQL中文排序规则设置
查看>>
30 个有关 Python 的小技巧
查看>>
CDN下nginx获取用户真实IP地址
查看>>
Jsp技术总结
查看>>
Sakai 11.x Build Failure
查看>>
面向对象+模块化设计绘制canvas星空动画
查看>>
Elastic Search学习笔记3——集群配置
查看>>
Unity客户端资源智能管理
查看>>