<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>




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 国产免费拔擦拔擦8X高清在线人 | 亚洲国产精品美女| 在线看片免费不卡人成视频| 精品亚洲成a人在线观看| 亚洲乱码国产乱码精品精| 精品国产sm捆绑最大网免费站| 亚洲狠狠婷婷综合久久| 国产亚洲精品精华液| 妞干网免费观看视频| 丁香花在线观看免费观看图片| 亚洲13又紧又嫩又水多| 久久亚洲高清综合| 免费一本色道久久一区| 99在线免费观看| 亚洲精品无码少妇30P| 亚洲不卡中文字幕无码| 免费精品国产自产拍观看| 一级毛片免费观看不卡的| 国产精品亚洲一区二区在线观看 | 免费观看国产小粉嫩喷水| 67194国产精品免费观看| 无码 免费 国产在线观看91| 亚洲欧洲精品久久| 亚洲一级片免费看| 成人午夜视频免费| 91高清免费国产自产| 国产精品hd免费观看| 亚洲日本VA午夜在线电影| 自怕偷自怕亚洲精品| 久久精品国产亚洲一区二区三区| 成人性生免费视频| 国产精品成人观看视频免费| 国产无遮挡又黄又爽免费网站| 国产精品亚洲精品久久精品 | 亚洲色欲色欲www在线丝| 国产精品免费看久久久无码| 成人免费观看一区二区| 久久国产精品成人片免费| aaa毛片免费观看| 免费国产在线精品一区| 亚洲国产成人精品无码区二本|