博客
关于我
强烈建议你试试无所不能的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/

你可能感兴趣的文章
java设计模式演示样例
查看>>
phantomjs 是什么?----主要是mac下面
查看>>
Codeforces Round #345 (Div. 2) D. Image Preview 暴力 二分
查看>>
suggest
查看>>
Java集合框架实现自定义排序
查看>>
数组添加:如何往数组的"null"位置插入数据呢?
查看>>
Number of Parallelograms(求平行四边形个数)
查看>>
转:基于TLS1.3的微信安全通信协议mmtls介绍
查看>>
ImageNet && 医学图像的识别
查看>>
HBase编程 API入门系列之delete(客户端而言)(3)
查看>>
Cocos2dx使用wxsqlite开源加密SQLite3数据库
查看>>
JMeter学习-内存溢出解决方法
查看>>
磨刀不误砍柴工——VS生成事件
查看>>
XE7 update1
查看>>
PHP RSA加解密示例(转)
查看>>
Mobile开发的饕餮盛宴-Zoomla!波CMS2 x2.1正式宣布
查看>>
swift:入门知识之控制流
查看>>
DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求
查看>>
Netstat 命令
查看>>
jQuery+HTML5弹出创意搜索框层
查看>>