nicky

          積水成海,滴水穿石。

          導航

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統計

          公告

          信心十足

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          【轉】:struts2之圖片驗證碼實現

          做注冊模塊,需要圖片驗證碼機制。google了一圈,自己再整理修改了一下,總算是弄出來了。思路就是在一個action里應用java的awt包里面的類繪制一個內存中的圖片,然后產生隨機數并將隨機數寫到圖片上,然后把action的返回類型設為stream,把圖片數據寫入到輸入流返回給瀏覽器。html可以通過img頁面直接用src屬性引用該action

              action的代碼如下
          1. import java.io.*;
          2. import javax.imageio.ImageIO;
          3. import javax.imageio.stream.ImageOutputStream;
          4. import java.awt.*;
          5. import java.awt.Color;
          6. import java.awt.image.BufferedImage;
          7. //DefaultAction類繼承了ActionSupport 并定義了session變量
          8. public class CreateValidateAction extends DefaultAction {
          9.     private ByteArrayInputStream inputStream;
          10.     //產生四個0~9的隨機數,放在一個字符串里
          11.     public String createRandomString() {
          12.         String str = "";
          13.         for (int i = 0; i < 4; i++) {
          14.             str += Integer.toString((new Double(Math.random() * 10)).intValue());
          15.         }
          16.         return str;
          17.     }
          18.     //隨機產生一個顏色
          19.     public Color createsRandomColor() {
          20.         int r = (new Double(Math.random() * 256)).intValue();
          21.         int g = (new Double(Math.random() * 256)).intValue();
          22.         int b = (new Double(Math.random() * 256)).intValue();
          23.         return new Color(r, g, b);
          24.     }
          25.     //生成一個內存圖片,將四個隨機數寫在圖片上
          26.     public BufferedImage createImage(String str) {
          27.         int width = 60;
          28.         int height = 22;
          29.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
          30.         // 獲取圖形上下文
          31.         Graphics g = image.getGraphics();
          32.         // 設定背景色
          33.         g.setColor(Color.WHITE);
          34.         g.fillRect(00, width, height);
          35.         //畫邊框
          36.         g.setColor(Color.black);
          37.         g.drawRect(00, width - 1, height - 1);
          38.         // 將認證碼顯示到圖象中
          39.         g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
          40.         //使用隨機顏色
          41.         g.setColor(this.createsRandomColor());
          42.         //將隨機字符串的每個數字分別寫到圖片上
          43.         g.drawString(Character.toString(str.charAt(0)), 817);
          44.         g.drawString(Character.toString(str.charAt(1)), 2017);
          45.         g.drawString(Character.toString(str.charAt(2)), 3317);
          46.         g.drawString(Character.toString(str.charAt(3)), 4517);
          47.         // 圖象生效
          48.         g.dispose();
          49.         return image;
          50.     }
          51.     //將圖片的以字節形式寫到InputStream里
          52.     public ByteArrayInputStream createInputStream() throws Exception {
          53.         //獲取隨機字符串
          54.         String str=this.createRandomString();
          55.         BufferedImage image = this.createImage(str);
          56.         //將產生的字符串寫入session,供校驗時使用
          57.         this.getSession().put("validateCode", str);
          58.         ByteArrayOutputStream output = new ByteArrayOutputStream();
          59.         ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
          60.         ImageIO.write(image, "JPEG", imageOut);
          61.         imageOut.close();
          62.         ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
          63.         output.close();
          64.         return input;
          65.     }
          66.     @Override
          67.     public String execute() throws Exception {
          68.         setInputStream(createInputStream());
          69.         return SUCCESS;
          70.     }
          71.     
          72.     public ByteArrayInputStream getInputStream() {
          73.         return inputStream;
          74.     }
          75.     public void setInputStream(ByteArrayInputStream inputStream) {
          76.         this.inputStream = inputStream;
          77.     }
          78. }

              然后是對應的struts的配置
          1.         <!--action的class是由spring提供的-->
          2.         <action name="createValidateAction" class="createValidateAction">
          3.             <result type="stream">
          4.                 <param name="contentType">image/jpeg</param>
          5.                 <param name="inputName">inputStream</param>
          6.             </result>
          7.         </action>

              最后就是html的寫法,點擊圖片的時候可以更新驗證碼
          1. <script type="text/javascript">
          2.     function changeValidateCode(obj) {
          3.         //獲取當前的時間作為參數,無具體意義
          4.         var timenow = new Date().getTime();
          5.         //每次請求需要一個不同的參數,否則可能會返回同樣的驗證碼
          6.         //據說和瀏覽器的緩存機制有關系,不太明白,照做吧
          7.         obj.src="createValidateAction.action?d="+timenow;
          8.     }
          9. </script>
          10. <img src="createValidateAction.action" onclick="changeValidateCode(this)"/>

          posted on 2009-04-23 15:47 nicky 閱讀(2103) 評論(3)  編輯  收藏

          評論

          # re: 【轉】:struts2之圖片驗證碼實現 2009-10-28 13:18 shareach

          同樣配置,為什么我后臺action執行了2次, 我http監視就是只有一次
          我的package是
          <package name="myDefPkg" extends="struts-default">
          腳本是
          <script type="text/javascript">
          function changeValidateCode() {
          var timenow = new Date().getTime();
          document.getElementById("validImg").src="<%=path %>/rand.do?tick="+timenow;
          }
          changeValidateCode();
          </script>
          謝謝  回復  更多評論   

          # re: 【轉】:struts2之圖片驗證碼實現 2010-03-02 14:12 xcvxcv

          cxvxcvxcv  回復  更多評論   

          # re: 【轉】:struts2之圖片驗證碼實現 2010-03-02 14:12 xcvxcv

          dfgfgdfgdfg  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 府谷县| 丰县| 菏泽市| 册亨县| 陆河县| 如东县| 射洪县| 门头沟区| 文昌市| 庆阳市| 绍兴市| 沂水县| 姚安县| 龙里县| 秀山| 邳州市| 牙克石市| 珠海市| 南岸区| 贵溪市| 乌兰察布市| 偃师市| 建平县| 伊通| 疏勒县| 遂溪县| 洪洞县| 永登县| 濮阳市| 东乌| 长兴县| 新兴县| 虹口区| 綦江县| 嘉义县| 卢湾区| 邹平县| 定安县| 岑溪市| 西林县| 中卫市|