<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

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

    圖片驗證碼

    Posted on 2009-05-25 23:19 啥都寫點 閱讀(466) 評論(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>




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 最新猫咪www免费人成| 国产国产成年年人免费看片| 亚洲图片激情小说| 香蕉视频在线观看免费国产婷婷| 免费视频成人国产精品网站| 亚洲AV无码乱码国产麻豆| 韩国免费一级成人毛片| 亚洲黄片手机免费观看| 亚洲妇女水蜜桃av网网站| 在线a亚洲v天堂网2018| 日韩内射激情视频在线播放免费 | 日韩中文无码有码免费视频 | 老司机在线免费视频| 无人视频在线观看免费播放影院| 久久久亚洲精品无码| 精品无码国产污污污免费| 成人黄网站片免费视频 | 99精品在线免费观看| WWW亚洲色大成网络.COM| 亚洲熟妇无码爱v在线观看| 亚洲日韩在线观看免费视频| 国产高清免费视频| 99免费在线视频| 国产AV无码专区亚洲AV蜜芽| 亚洲欧洲国产精品久久| 国产亚洲成人在线播放va| 免费看a级黄色片| 91在线手机精品免费观看| 人妻仑乱A级毛片免费看| 中文字幕精品三区无码亚洲| 亚洲a在线视频视频| 中文字幕亚洲专区| 真实乱视频国产免费观看| 91久久成人免费| 久久久精品免费国产四虎| 无码的免费不卡毛片视频| 亚洲成AV人片高潮喷水| 亚洲图片中文字幕| 图图资源网亚洲综合网站| 亚洲美女又黄又爽在线观看| 亚洲国产精品人人做人人爽|