Java驗證碼


下面這段代碼可用於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> 

先將代碼貼在這兒,以后再進行完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM