zoukankan      html  css  js  c++  java
  • springMVC--动态验证码实现

    在网站开发过程中我们一般都会为了防止用户连续提交都会提供验证码的功能,简单来说就是生成一个动态图片,在图片中保存一些校验信息,将校验信息放到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. }  
    在jsp文件中请求这个图片地址

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



  • 相关阅读:
    windows权限维持之注册表
    mstsc痕迹清理
    内网常用爆破手法
    RDP攻击&防御
    Java SPI 机制
    mysqldump 数据库备份
    Redis分布式锁
    Seata分布式事务中间件学习和实践
    pytube
    idea github登录
  • 原文地址:https://www.cnblogs.com/jpfss/p/8441199.html
Copyright © 2011-2022 走看看