標籤:stringbu   util   static   time   stack   val   ida   output   gets   
package lizikj.bigwheel.pcsystem.util;
import javax.imageio.ImageIO; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Date; 
import java.util.Random; 
 
/** 
 * 驗證碼產生器 
 * 
 * @author 
 */ 
public class ValidateCode { 
 // 圖片的寬度。 
 private int width = 160; 
 // 圖片的高度。 
 private int height = 40; 
 // 驗證碼字元個數 
 private int codeCount = 5; 
 // 驗證碼幹擾線數 
 private int lineCount = 150; 
 // 驗證碼 
 private String code = null; 
 // 驗證碼圖片Buffer 
 private BufferedImage buffImg = null; 
 
 // 驗證碼範圍,去掉0(數字)和O(拼音)容易混淆的(小寫1和L也可以去掉,大寫不用了) 
 private char[] codeSequence = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘, 
 ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, 
 ‘X‘, ‘Y‘, ‘Z‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘}; 
 
 /** 
 * 預設建構函式,設定預設參數 
 */ 
 public ValidateCode() { 
 this.createCode(); 
 } 
 
 /** 
 * @param width 圖片寬 
 * @param height 圖片高 
 */ 
 public ValidateCode(int width, int height) { 
 this.width = width; 
 this.height = height; 
 this.createCode(); 
 } 
 
 /** 
 * @param width 圖片寬 
 * @param height 圖片高 
 * @param codeCount 字元個數 
 * @param lineCount 幹擾線條數 
 */ 
 public ValidateCode(int width, int height, int codeCount, int lineCount) { 
 this.width = width; 
 this.height = height; 
 this.codeCount = codeCount; 
 this.lineCount = lineCount; 
 this.createCode(); 
 } 
 
 public void createCode() { 
 int x = 0, fontHeight = 0, codeY = 0; 
 int red = 0, green = 0, blue = 0; 
 
 x = width / (codeCount + 2);//每個字元的寬度(左右各空出一個字元) 
 fontHeight = height - 2;//字型的高度 
 codeY = height - 4; 
 
 // 映像buffer 
 buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
 Graphics2D g = buffImg.createGraphics(); 
 // 產生隨機數 
 Random random = new Random(); 
 // 將映像填充為白色 
 g.setColor(Color.WHITE); 
 g.fillRect(0, 0, width, height); 
 // 建立字型,可以修改為其它的 
 Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); 
// Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, fontHeight); 
 g.setFont(font); 
 
 for (int i = 0; i < lineCount; i++) { 
 // 設定隨機開始和結束座標 
 int xs = random.nextInt(width);//x座標開始 
 int ys = random.nextInt(height);//y座標開始 
 int xe = xs + random.nextInt(width / 8);//x座標結束 
 int ye = ys + random.nextInt(height / 8);//y座標結束 
 
 // 產生隨機的顏色值,讓輸出的每個幹擾線的顏色值都將不同。 
 red = random.nextInt(255); 
 green = random.nextInt(255); 
 blue = random.nextInt(255); 
 g.setColor(new Color(red, green, blue)); 
 g.drawLine(xs, ys, xe, ye); 
 } 
 
 // randomCode記錄隨機產生的驗證碼 
 StringBuffer randomCode = new StringBuffer(); 
 // 隨機產生codeCount個字元的驗證碼。 
 for (int i = 0; i < codeCount; i++) { 
 String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]); 
 // 產生隨機的顏色值,讓輸出的每個字元的顏色值都將不同。 
 red = random.nextInt(255); 
 green = random.nextInt(255); 
 blue = random.nextInt(255); 
 g.setColor(new Color(red, green, blue)); 
 g.drawString(strRand, (i + 1) * x, codeY); 
 // 將產生的四個隨機數組合在一起。 
 randomCode.append(strRand); 
 } 
 // 將四位元字的驗證碼儲存到Session中。 
 code = randomCode.toString(); 
 } 
 
 public void write(String path) throws IOException { 
 OutputStream sos = new FileOutputStream(path); 
 this.write(sos); 
 } 
 
 public void write(OutputStream sos) throws IOException { 
 ImageIO.write(buffImg, "png", sos); 
 sos.close(); 
 } 
 
 public BufferedImage getBuffImg() { 
 return buffImg; 
 } 
 
 public String getCode() { 
 return code; 
 } 
 
 /** 
 * 測試函數,預設產生到d盤 
 * @param args 
 */ 
 public static void main(String[] args) { 
 ValidateCode vCode = new ValidateCode(160,40,5,150); 
 try { 
 String path="D:/"+new Date().getTime()+".png"; 
 System.out.println(vCode.getCode()+" >"+path); 
 vCode.write(path); 
 } catch (IOException e) { 
 e.printStackTrace(); 
 } 
 } 
} 
 
jsp
 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:if test = "${pageContext.request.contextPath == ‘/‘}">
<c:set var="ctx" value=""/>
</c:if>
<c:if test = "${pageContext.request.contextPath != ‘/‘}">
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
</c:if>
<script>
var CTX=‘${ctx}‘;
var type =0;
</script>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Cache-Control" content="no-store"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-10"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>登入系統</title>
<meta name="description" content="User login page" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<script type="text/javascript" src="${ctx}/assets/js/jquery.min.js"></script>
</head>
<body class="login-layout light-login">
<div class="form-group col-lg-6"> 
 <label for="id" class="col-sm-4 control-label"> 
 驗證碼: 
 </label> 
 <div class="col-sm-8"> 
 <input type="text" id="code" name="code" class="form-control" style="width:250px;"/> 
 <img id="imgObj" alt="驗證碼" src="${ctx}/validateCode.do" onclick="changeImg()"/> 
 <a href="#" onclick="changeImg()">換一張</a> 
 </div> 
</div> 
<script type="text/javascript"> 
 // 重新整理圖片 
 function changeImg() { 
 var imgSrc = $("#imgObj"); 
 var src = imgSrc.attr("src"); 
 imgSrc.attr("src", changeUrl(src)); 
 } 
 //為了使每次產生圖片不一致,即不讓瀏覽器讀緩衝,所以需要加上時間戳記 
 function changeUrl(url) { 
 var timestamp = (new Date()).valueOf(); 
 var index = url.indexOf("?",url); 
 
 if (index > 0) { 
 url = url.substring(index, url.indexOf(url, "?"));
 } 
 if ((url.indexOf("&") >= 0)) { 
 url = url + "×tamp=" + timestamp; 
 } else { 
 url = url + "?timestamp=" + timestamp; 
 } 
 return url; 
 } 
</script> 
</body>
</html>
 
controller
/**
 * 響應驗證碼頁面 
 * @param request
 * @param response
 * @param session
 * @return
 * @throws Exception
 */
@RequestMapping("/validateCode.do")
public String validateCode(HttpServletRequest request,HttpServletResponse response) throws Exception {
// 設定響應的類型格式為圖片格式 
 response.setContentType("image/jpeg"); 
 //禁止映像緩衝。 
 response.setHeader("Pragma", "no-cache"); 
 response.setHeader("Cache-Control", "no-cache"); 
 response.setDateHeader("Expires", 0); 
 HttpSession session = request.getSession(true); 
 
 ValidateCode vCode = new ValidateCode(120,40,5,100); 
 //刪除以前的
 session.removeAttribute("randomCode");
 session.setAttribute("randomCode", vCode.getCode().toLowerCase()); 
 vCode.write(response.getOutputStream()); 
 
return null;
}
 
來自:http://blog.csdn.net/zhulin40/article/details/51899487
java 驗證碼