生成驗證碼


controller

@RequestMapping("/drawCheckCode")
public void drawCheckCode(HttpServletResponse resp,HttpSession session) throws IOException {
        resp.setContentType("image/jpg");
        int width = 200;
        int height = 30;
        Captcha c = Captcha.getInstance();
        c.set(width, height);
        String checkcode = c.generateCheckcode();
        session.setAttribute("cc", checkcode);
        OutputStream os = resp.getOutputStream();
        ImageIO.write(c.generateCheckImg(checkcode), "jpg", os);
    }

util

package org.konghao.basic.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
public class Captcha {
    private int width;
    private int height;
    private int num;
    private String code;
    private static final Random ran = new Random();
    private static Captcha captcha;
    private Captcha(){
        code = "0123456789";
        num = 4;
    }

    public static Captcha getInstance() {
        if(captcha==null) captcha = new Captcha();
        return captcha;
    }

    public void set(int width,int height,int num,String code) {
        this.width = width;
        this.height = height;
        this.setNum(num);
        this.setCode(code);
    }

    public void set(int width,int height) {
        this.width = width;
        this.height = height;
    }

    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }

    public String generateCheckcode() {
        StringBuffer cc = new StringBuffer();
        for(int i=0;i<num;i++) {
            cc.append(code.charAt(ran.nextInt(code.length())));
        }
        return cc.toString();
    }

    public BufferedImage generateCheckImg(String checkcode) {
        //創建一個圖片對象
        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //獲取圖片對象的畫筆
        Graphics2D graphic = img.createGraphics();
        graphic.setColor(Color.WHITE);
        graphic.fillRect(0, 0, width, height);
        graphic.setColor(Color.BLACK);
        graphic.drawRect(0, 0, width-1, height-1);
        Font font = new Font("宋體",Font.BOLD+Font.ITALIC,(int)(height*0.8));
        graphic.setFont(font);
        for(int i=0;i<num;i++) {
            graphic.setColor(new Color(ran.nextInt(180),ran.nextInt(180),ran.nextInt(180)));
            graphic.drawString(String.valueOf(checkcode.charAt(i)), i*(width/num)+4, (int)(height*0.8));
        }

        //加一些點
        for(int i=0;i<(width+height);i++) {
            graphic.setColor(new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));
            graphic.drawOval(ran.nextInt(width), ran.nextInt(height), 1, 1);
        }

        //加一些線
        for(int i=0;i<4;i++) {
            graphic.setColor(new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));
            graphic.drawLine(0, ran.nextInt(height), width, ran.nextInt(height));
        }
        return img;
    }


}

html+JS

<div class="col-sm-10">
   <input id="checkCode" class="form-control" >
   <img id="codeImg" alt="驗證碼" src="${base}/usr/drawCheckCode"  style=" margin-top: 10px;margin-right: 18px;"/>
   <span style="width:100px;height:30px"><a href="javascript:void(0)" onclick="changeimg()">看不清楚 換一張</a> </span>
</div>
<script type="text/javascript">
function changeimg() {
    var myimg = document.getElementById("codeImg"); 
    now = new Date(); //如果不設定此事件的話會出現只能換一次的bug
    myimg.src="${base}/usr/drawCheckCode?code="+now.getTime();
} 
</script>
發佈了57 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章