Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          圖片驗證碼

          Posted on 2009-05-25 23:19 啥都寫點 閱讀(467) 評論(0)  編輯  收藏 所屬分類: J2SE
             這里介紹一個簡單struts2的驗證碼程序:
          package com.yan;

          import java.io.ByteArrayInputStream;
          import com.opensymphony.xwork2.Action;
          import com.opensymphony.xwork2.ActionContext;


          /**
           * 輸出驗證碼的Action
           * 
          @author Billy
           
          */
          public class RandomAction{

              
              
          private static final long serialVersionUID = -540011645418859040L;
              
              
          private ByteArrayInputStream inputStream;
              

              
          public ByteArrayInputStream getInputStream() {
                  
          return inputStream;
              }

              
          public void setInputStream(ByteArrayInputStream inputStream) {
                  
          this.inputStream = inputStream;
              }
              
              
          public String execute()  {
                  
              RandomNumUtil rdnu
          =RandomNumUtil.Instance(); 
                
              
          this.setInputStream(rdnu.getImage());//取得帶有隨機字符串的圖片 
                  
               ActionContext.getContext().getSession().put(
          "VerificationCode", rdnu.getString());//取得隨機字符串放入HttpSession 

              
          return Action.SUCCESS;
              }
          }



          package com.yan;

          import java.awt.Color;
          import java.awt.Font;
          import java.awt.Graphics;
          import java.awt.image.BufferedImage;
          import java.io.ByteArrayInputStream;
          import java.io.ByteArrayOutputStream;
          import java.util.Random;

          import javax.imageio.ImageIO;
          import javax.imageio.stream.ImageOutputStream;

          public class RandomNumUtil {
              
          private ByteArrayInputStream image;// 圖像
              private String str;// 驗證碼

              
          private static int width = 60;// 驗證碼圖片的長度
              private static int height = 20// 驗證碼圖片的高度
              private static int number = 4;// 驗證碼的位數

              
          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() {
                  
          // 在內存中創建圖象

                  BufferedImage image 
          = new BufferedImage(width, height,
                          BufferedImage.TYPE_INT_RGB);
                  
          // 獲取圖形上下文
                  Graphics g = image.getGraphics();
                  
          // 生成隨機類
                  Random random = new Random();
                  
          // 設定背景色
                  g.setColor(getRandColor(200250));
                  g.fillRect(
          00, width, height);
                  
          // 設定字體
                  g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
                  
          // 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
                  g.setColor(getRandColor(160200));
                  
          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 < number; 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 + 616);
                  }
                  
          // 賦值驗證碼
                  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);
              }

          }

          struts.xml
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
              
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
              
          "http://struts.apache.org/dtds/struts-2.0.dtd">
          <struts>
          <include file="struts-default.xml"/>
               
          <package name="ryan" extends="struts-default">
                  
          <action name="random" class="com.yan.RandomAction">
                    
          <result type="stream">     
                       
          <param name="contentType">image/jpeg</param>     
                       
          <param name="inputName">inputStream</param>     
                  
          </result>  
                  
          </action>
            
             
          <action name="phoenix" class="com.yan.PhoenixAction">
               
          <result name="input">/identifying.jsp</result>   
               
          <result name="success">/success.jsp</result>  
             
          </action>
             
                  
              
          </package>
          </struts>
           

          頁面
          <%@ page language="java"  pageEncoding="utf-8"%>
          <%
          String path 
          = request.getContextPath();
          String basePath 
          = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
          %>
          <%@ taglib prefix="s" uri="/struts-tags"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            
          <head>
               
          <script type="text/javascript">
                function changeValidateCode(obj) {   
                         
          //獲取當前的時間作為參數,無具體意義   
                      var timenow = new Date().getTime();   
                         
          //每次請求需要一個不同的參數,否則可能會返回同樣的驗證碼   
                      
          //這和瀏覽器的緩存機制有關系,也可以把頁面設置為不緩存,這樣就不用這個參數了。   
                      obj.src="random.action?d="+timenow;   
                  }
               
               
          </script>
            
          </head>
            
            
          <body>
              
          <s:fielderror></s:fielderror>
               
          <s:form action="phoenix">     
               
          <s:textfield name="inputCode" id="inputCode" cssStyle="width:81px"/><img src="random.action" onclick="changeValidateCode(this)" title="點擊圖片刷新驗證碼"/><br>
               
          <s:submit value="submit"></s:submit>
               
          </s:form>
               
               
            
          </body>
          </html>




                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 潜江市| 富川| 武威市| 延川县| 通榆县| 泗洪县| 大荔县| 开化县| 鸡西市| 灌南县| 朔州市| 繁昌县| 洞口县| 师宗县| 绥芬河市| 桐梓县| 类乌齐县| 鄢陵县| 高平市| 互助| 临湘市| 宜城市| 化州市| 胶南市| 增城市| 顺昌县| 东安县| 山东省| 临海市| 东乡| 南岸区| 井研县| 保康县| 延川县| 万源市| 黄浦区| 遂川县| 太仆寺旗| 辽宁省| 呼图壁县| 平潭县|