/**
* 1、導入驗證碼工具類
*/public class RandomValidateCode {
public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
private Random random = new Random();
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//隨機產生的字符串
private int width = 80;//圖片寬
private int height = 32;//圖片高
private int lineSize = 40;//干擾線數量
private int stringNum = 4;//隨機產生字符數量
/*
* 獲得字體
*/
private Font getFont(){
return new Font("Fixedsys",Font.CENTER_BASELINE,18);
}
/*
* 獲得顏色
*/
private Color getRandColor(int fc,int bc){
if(fc > 255)
fc = 255;
if(bc > 255)
bc = 255;
int r = fc + random.nextInt(bc-fc-16);
int g = fc + random.nextInt(bc-fc-14);
int b = fc + random.nextInt(bc-fc-18);
return new Color(r,g,b);
}
/**
* 生成隨機圖片
*/
public void getRandcode(HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession();
//BufferedImage類是具有緩衝區的Image類,Image類是用於描述圖像信息的類
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();//產生Image對象的Graphics對象,改對象可以在圖像上進行各種繪製操作
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
g.setColor(getRandColor(110, 133));
//繪製干擾線
for(int i=0;i<=lineSize;i++){
drowLine(g);
}
//繪製隨機字符
String randomString = "";
for(int i=1;i<=stringNum;i++){
randomString=drowString(g,randomString,i);
}
session.removeAttribute(RANDOMCODEKEY);
session.setAttribute(RANDOMCODEKEY, randomString);
System.out.println(randomString);
g.dispose();
try {
ImageIO.write(image, "JPEG", response.getOutputStream());//將內存中的圖片通過流動形式輸出到客戶端
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 繪製字符串
*/
private String drowString(Graphics g,String randomString,int i){
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
randomString +=rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13*i, 16);
return randomString;
}
/*
* 繪製干擾線
*/
private void drowLine(Graphics g){
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
}
/*
* 獲取隨機的字符
*/
public String getRandomString(int num){
return String.valueOf(randString.charAt(num));
}
}
2、頁面請求的action
@RequestMapping(value = "/login/image")
public void image(HttpServletResponse response,HttpServletRequest request){
response.setContentType("image/jpeg");//設置相應類型,告訴瀏覽器輸出的內容爲圖片
response.setHeader("Pragma", "No-cache");//設置響應頭信息,告訴瀏覽器不要緩存此內容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
RandomValidateCode randomValidateCode = new RandomValidateCode();
try {
randomValidateCode.getRandcode(request, response);//輸出圖片方法
} catch (Exception e) {
e.printStackTrace();
}
}
3、檢查驗證碼是否正確
@RequestMapping(value = "/login/checkImage",method = RequestMethod.POST)
@ResponseBody
public Boolean checkImage(@RequestParam String randomCode){
String rightCode = (String) AnbiServletUtils.getSession().getAttribute(RandomValidateCode.RANDOMCODEKEY);
if(!rightCode.equalsIgnoreCase(randomCode)){
return false;
}else{
return true;
}
}
4、頁面請求
<img style="margin-left: 15px" title="點擊更換" id="refresh-img" οnclick="refresh(this)" src="#springUrl('')/login/image">
/**
*刷新驗證碼圖片
*/
function refresh(obj){
obj.src = "#springUrl('')/login/image?"+Math.random();
}