Java 实现验证码功能

所需文件以及技术:

  · SecurityUtil.java  (后面我会复制给大家)
  · 图像处理技术
  · 向客户端输出io流

 一,实现的原理,当视图页面加载的时候通过<img >元素的src属性去请求获得验证码图片,请求控制层验证码生成类随机生成4个字母或数字(验证码长度可以修改),将生成的验证码存储在session对象里面,最后通过ImageIO响应给客户端。

二,实现的步骤:

1,html:

<script type="text/javascript">
      function reloadCode() {         
 
 document.getElementById("imgSignCode").src="../signcode/signcode/get.do?r=" + new Date().getTime();    //这里为什么会加一个时间戳参数呢?  浏览器带有缓存功能
//当一个src中的URL请求一次后,再次请求浏览器就不会再去请求获得新数据,而是直接用
//上次请求返回的数据
    }
      </script>
      <body>
        <img id="imgSignCode" src="../signcode/signcode/get.do" onclick="reloadCode()" title="重新获取" style="cursor:pointer;"/> 
      </body>

2,Controller层方法:

/**
    * ajax获取验证码
    */
    @ResponseBody
    @RequestMapping(value = "/getSecurityCode.ajax", produces = {"application/json;charset=UTF-8"})
    public void getSecurityCode(HttpServletResponse response, HttpServletRequest request){
        // 通知浏览器不要缓存 
                response.setHeader("Expires", "-1"); 
                response.setHeader("Cache-Control", "no-cache"); 
                response.setHeader("Pragma", "-1"); 
                SecurityUtil util = SecurityUtil.Instance(); 
                // 将验证码输入到session中,用来验证 
                String code = util.getString(); 
                request.getSession().setAttribute("code", code); 
                // 输出打web页面 
                try {
            ImageIO.write(util.getImage(), "jpg", response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        }

三,SecurityUtil代码:

package cc.royao.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

public class SecurityUtil {
   
    private BufferedImage image;// 图像 
    private String str;// 验证码 
    private static char code[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789".toCharArray(); 
    public static final String SESSION_CODE_NAME="code"; 
    private SecurityUtil() { 
        init();// 初始化属性 
    } 

    /*
    * 取得RandomNumUtil实例
    */ 
    public static SecurityUtil Instance() { 
        return new SecurityUtil(); 
    } 
   
    /*
    * 取得验证码图片
    */ 
    public BufferedImage getImage() { 
        return this.image; 
    } 
   
    /*
    * 取得图片的验证码
    */ 
    public String getString() { 
        return this.str; 
    } 
   
    private void init() { 
        // 在内存中创建图象 
        int width = 85, height = 20; 
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
        // 获取图形上下文 
        Graphics g = image.getGraphics(); 
        // 生成随机类 
        Random random = new Random(); 
        // 设定背景色 
        g.setColor(getRandColor(200, 250)); 
        g.fillRect(0, 0, width, height); 
        // 设定字体 
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); 
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 
        g.setColor(getRandColor(160, 200)); 
        for (int i = 0; i < 155; i++) { 
            int x = random.nextInt(width); 
            int y = random.nextInt(height); 
            int xl = random.nextInt(12); 
            int yl = random.nextInt(12); 
            g.drawLine(x, y, x + xl, y + yl); 
        } 
        // 取随机产生的认证码(4位数字) 
        String sRand = ""; 
        for (int i = 0; i < 4; i++) { 
            String rand = String.valueOf(code[random.nextInt(code.length)]); 
            sRand += rand; 
            // 将认证码显示到图象中 
            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); 
            // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 
            g.drawString(rand, 13 * i + 6, 16); 
        } 
        // 赋值验证码 
        this.str = sRand; 
   
        // 图象生效 
        g.dispose(); 
        this.image = image;/* 赋值图像 */ 
    } 
   
    /*
    * 给定范围获得随机颜色
    */ 
    private Color getRandColor(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); 
    } 
}

猜你喜欢

转载自www.linuxidc.com/Linux/2018-04/152053.htm
今日推荐