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>