下面這段代碼可用於Jsp+Servle+JavaBean中做驗證碼:
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%! 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); } %>
<%
//設置頁面不緩存
response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); // 在內存中創建圖象
int width=60, 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)); //畫邊框 //g.setColor(new Color()); //g.drawRect(0,0,width-1,height-1); // 隨機產生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 rand = request.getParameter("rand"); //rand = rand.substring(0,rand.indexOf("."));
String sRand=""; for (int i=0;i<4;i++){ String rand=String.valueOf(random.nextInt(10)); 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); } // 將認證碼存入SESSION
session.setAttribute("ccode",sRand); // 圖象生效
g.dispose(); // 輸出圖象到頁面
ImageIO.write(image, "JPEG", response.getOutputStream()); out.clear(); out = pageContext.pushBody(); %>
下面是通過Struts2做的驗證碼。其實原理是一樣的,只是列在這里好隨時看看:
1、login.jsp頁面程序
<script type="text/javascript"> function changeValidateCode(obj) { //獲取當前的時間作為參數,無具體意義
var timenow = new Date().getTime(); //每次請求需要一個不同的參數,否則可能會返回同樣的驗證碼 //這和瀏覽器的緩存機制有關系,也可以把頁面設置為不緩存,這樣就不用這個參數了。
obj.src="rand.action?d="+timenow; } </script>
在表單中添加下面這句話:
<s:text name="random"></s:text>: <s:textfield name="rand" size="5"></s:textfield>
<img src="rand.action" onclick="changeValidateCode(this)" title="點擊圖片刷新驗證碼"/>
2:RandomNumUtil.java 生成驗證碼的類文件
public class RandomNumUtil { private ByteArrayInputStream image;//圖像
private String str;//驗證碼
private RandomNumUtil(){ init();//初始化屬性
} /* * 取得RandomNumUtil實例 */
public static RandomNumUtil Instance(){ return new RandomNumUtil(); } /* * 取得驗證碼圖片 */
public ByteArrayInputStream 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); } // 取隨機產生的認證碼(6位數字)
String sRand=""; for (int i=0;i<6;i++){ String rand=String.valueOf(random.nextInt(10)); 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(); ByteArrayInputStream input=null; ByteArrayOutputStream output = new ByteArrayOutputStream(); try{ ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); ImageIO.write(image, "JPEG", imageOut); imageOut.close(); input = new ByteArrayInputStream(output.toByteArray()); }catch(Exception e){ System.out.println("驗證碼圖片產生出現錯誤:"+e.toString()); } this.image=input;/* 賦值圖像 */ } /* * 給定范圍獲得隨機顏色 */
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); } }
3:RandomAction.java 生成驗證碼的action程序
public class RandomAction extends ActionSupport{ private ByteArrayInputStream inputStream; public String execute() throws Exception{ RandomNumUtil rdnu=RandomNumUtil.Instance(); this.setInputStream(rdnu.getImage());//取得帶有隨機字符串的圖片
ActionContext.getContext().getSession().put("random", rdnu.getString());//取得隨機字符串放入HttpSession
return SUCCESS; } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } public ByteArrayInputStream getInputStream() { return inputStream; } }
4:LoginAction.java 驗證驗證碼的action
private String rand; //表單中的rand
public String getRand() { return rand; } public void setRand(String rand) { this.rand = rand; } //從session中取出RandomAction.java 中生成的驗證碼random
String arandom=(String)(ActionContext.getContext().getSession().get("random")); //下面就是將session中保存驗證碼字符串與客戶輸入的驗證碼字符串對比了
if(arandom.equals(this.getRand())) { ActionContext.getContext().getSession().put("user", this.getUsername()); return SUCCESS; } else { return ERROR; }
5:配置文件
<!-- Random驗證碼 -->
<action name="rand" class="com.mxl.rand.RandomAction">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
先將代碼貼在這兒,以后再進行完善。
