千里馬

          天馬行空

          生成圖形的縮略圖和動態的圖形的驗證碼

          1,縮略圖是當今web站點,尤其是提供圖片信息瀏覽功能的網站,都會使用到的技術,它能夠有效的提高用戶瀏覽信息的速度。
          2,縮略圖與原圖的本質區別是文件大小驟減,對于瀏覽型的圖片來說,縮略圖就是在不失去原有的瀏覽效果的前提下提高瀏覽速度的作用。
          3,      
              ... 
                    response.setContentType("image/jpeg");
                     FileInputStream fin=new FileInputStream("E:\\Users\\lizi\\Workspaces\\MyEclipse 8.5\\JSPTest\\src\\javal.jpg");
                     Image src=ImageIO.read(fin);
                     int h=60;
                     int w=60;
                     BufferedImage tag=new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
                     tag.getGraphics().drawImage(src, 0, 0, w, h, null);
                     ImageIO.write(tag, "JPEG", response.getOutputStream());
              ...
          4,圖形驗證碼是為了防止惡意注冊和登錄而設計的。有些惡意程序(如注冊機)可以進行不斷的注冊和登錄嘗試。如果沒有圖形驗證碼,web服務器會不堪重負,有時還會短時間內占滿服務器的磁盤空間。圖形驗證碼可以很好的解決這類問題,因為隨機的驗證碼是以圖形的方式呈現給用戶的,還包含了一些干擾點,只能肉眼才能看清楚驗證碼的值。
          5,圖形驗證碼的原理其實很簡單,在用戶注冊或登錄前,生成一個隨機的驗證碼并保存在會話session中,用戶提交請求以后,首先驗證輸入的驗證碼是否正確,如果錯誤則直接返回。所以圖形驗證碼的核心在于如何使用java的2D圖形編程API來繪制生成的驗證碼和干擾點,然后再把生成的圖片對象寫到客戶端。
          以下是使用動態圖形驗證碼的基本步驟:
             (1)創建一個圖形對象。一般還要初始化背景顏色和邊框。
             int width=60,height=20;//定義寬度和高度
              //在內存中創建圖像
             BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
             Graphics g=image.getGraphics();//獲取圖形上下文
             g.setClor(new Color(0xDCDCDC));
             g.fillRect(0,0,width,height);
             g.setColr(Color.black);
             g.drawRect(0,0,width-1,height-1);
             (2)產生隨機數字。如果位數不足還需補零,以下是生成4位長度的隨機數字示例代碼:
           //取隨機產生的驗證碼(4位)
           
              //設置返回內容的MIME類型,這里是jpeg圖片。
            response.setContentType("image/jpeg");
            //為了保證每次的驗證碼每次訪問都是新的,需要指定驗證碼圖片不從瀏覽器緩存里獲得。
            response.setHeader("Cache-Control","no-cache,nust-revalidate");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Last-Modified", new  Date().toString());
            response.setDateHeader("Expires",0);
            //在內存中創建圖像。
            int width=60,height=20;
            BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
            Graphics g=image.getGraphics();
            //設定背景色
            g.setColor(new Color(0xDCDCDC));
            g.fillRect(0, 0, width, height);
            //畫邊框
            g.setColor(Color.black);
            g.drawRect(0, 0, width-1, height-1);
            //隨機產生的驗證碼(4位數),小于4位的的前面補零。
            Random r=new Random();
            int rst=0;
            while((rst=r.nextInt(10000))<0){
             
            }
            String rand=rst+"";
            switch (rand.length()) {
            case 1:
             rand="000"+rand;
             break;
            case 2:
             rand="00"+rand;
             break;
            case 3:
             rand="0"+rand;
             break;
            default:
             rand=rand.substring(0, 4);
             break;
            }
            //將驗證碼存入session
            request.getSession().setAttribute("rand",rand);
               // 將驗證碼顯示到圖像中
            g.setColor(Color.red);
            g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
            g.drawString(rand.charAt(0)+"",8 ,17);
            g.drawString(rand.charAt(1)+"", 20, 15);
            g.drawString(rand.charAt(2)+"", 35,18 );
            g.drawString(rand.charAt(3)+"",45, 15);
            //隨機產生50個干擾點,使圖像中的驗證碼不已被其他程序探測到
            Random random=new Random();
            for (int i = 0; i < 1500; i++) {
             int x=random.nextInt(width);
             int y=random.nextInt(width);
             g.drawOval(x, y, 0, 0);
            }
            g.dispose();//圖形生效
            //輸出圖形到頁面
            ImageIO.write(image, "JPEG", response.getOutputStream());

          posted on 2012-05-30 18:32 Mr Lee 閱讀(548) 評論(0)  編輯  收藏 所屬分類: java技術

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章檔案

          (hibernate)http://www.aygfsteel.com/dyllove98/archive/2012/05/12/377959.html

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鲁甸县| 涞源县| 宜兰县| 法库县| 临西县| 石门县| 宁晋县| 双鸭山市| 香港| 萨迦县| 抚顺县| 西华县| 凌云县| 渝北区| 高州市| 大新县| 枣庄市| 香格里拉县| 桦南县| 新和县| 玛多县| 琼结县| 永嘉县| 岳普湖县| 乐山市| 太湖县| 连山| 滁州市| 安顺市| 呼伦贝尔市| 克拉玛依市| 天台县| 镇康县| 西吉县| 朝阳市| 济阳县| 黔江区| 佛冈县| 子长县| 山丹县| 巴里|