莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          rails實現(xiàn)驗證碼

          Posted on 2007-04-09 17:13 dennis 閱讀(3445) 評論(3)  編輯  收藏 所屬分類: 動態(tài)語言
              網(wǎng)上其實有一大堆這樣的資料了,我再寫也沒多大價值,談下幾個注意點吧。
          1.在windows上安裝Rmagic,如果你是通過gem安裝的,
          require 'Rmagic'
          要修改為:
          require 'rubygems'
          require 
          'Rmagick'
          才能正確引入。

          2.網(wǎng)上那個例子,畫布是使用Rmagic內(nèi)置的圖像格式,Rmagic內(nèi)置的圖像格式還有:

          gradient*

          梯度,比如gradient:red-blue

          granite

          花崗石,比如: "granite:".

          logo

          logo型的圖像. 如: "logo:"后面會多顯示一個五角星^_^

          netscape

          非常漂亮的彩條。如: "netscape:"

          null*

          空白 使用方式: "null:"

          rose


          玫瑰 使用方式 : "rose:"

          xc*

          設(shè)置一個背景色,比如"xc:green"


          一個修改的例子,在rails的models下存為noisy_image.rb,在Controller就可以這樣調(diào)用NoisyImage.new(6) :


          require 'rubygems'
          require 
          'Rmagick'
          class NoisyImage
            include Magick
            attr_reader :code, :code_image
            Jiggle 
          = 15
            Wobble 
          = 15
            
            
          def initialize(len)
              chars 
          = ('a'..'z').to_a - ['a','e','i','o','u']
              code_array
          =[]
              
          1.upto(len) {code_array << chars[rand(chars.length)]}
              granite 
          = Magick::ImageList.new('xc:#EDF7E7')
              canvas 
          = Magick::ImageList.new
              canvas.new_image(
          32*len, 50, Magick::TextureFill.new(granite))
              text 
          = Magick::Draw.new
              text.font_family 
          = 'times'
              text.pointsize 
          = 40
              cur 
          = 10
              
              code_array.each{
          |c|
                rand(
          10> 5 ? rot=rand(Wobble):rot= -rand(Wobble)
                rand(
          10> 5 ? weight = NormalWeight : weight = BoldWeight
                text.annotate(canvas,0,0,cur,
          30+rand(Jiggle),c){
                  self.rotation
          =rot
                  self.font_weight 
          = weight
                  self.fill 
          = 'green'
                }
                cur 
          += 30
              }
              @code 
          = code_array.to_s
              @code_image 
          = canvas.to_blob{
                self.format
          ="JPG" 
              }
            end
            
          end

          3.與rails應(yīng)用的結(jié)合,和一般的驗證碼原理一樣,將產(chǎn)生的隨機數(shù)存儲在session或者request范圍內(nèi),提交的時候進行比較驗證即可。比如產(chǎn)生圖片的時候?qū)㈦S機字母存儲在session[:code]中:

           session[:noisy_image] = NoisyImage.new(6)

           session[:code] = session[:noisy_image].code

          驗證的時候,比較提交的type_code與session[:code]即可,為了安全性考慮,最好還是不考慮使用客戶端驗證。

           unless session[:code]==params[:type_code]
                flash[:notice]
          ='驗證碼填寫錯誤,請重新注冊,謝謝!'
                
          return redirect_to :action=>:new  
           end

          在頁面顯示圖片,類似servlet一樣直接調(diào)用Controller的action:

           def code_image
              image 
          = session[:noisy_image].code_image
              send_data image, :type 
          => 'image/jpeg', :disposition => 'inline'
            end

          <img height='30' src="/test/code_image">





          評論

          # re: rails實現(xiàn)驗證碼  回復(fù)  更多評論   

          2007-08-16 16:10 by sixwings
          請問 如何實現(xiàn) 換個驗證碼 然后只更新那個圖片啊

          # re: rails實現(xiàn)驗證碼  回復(fù)  更多評論   

          2008-07-16 16:45 by wzp2000
          granite = Magick::ImageList.new('xc:#EDF7E7')

          為什么提示我這一句:can't convert String into Integer

          樓主知道是什么原因么?

          # re: rails實現(xiàn)驗證碼[未登錄]  回復(fù)  更多評論   

          2008-07-16 17:18 by dennis
          @wzp2000
          這個文章用的RMagic可能已經(jīng)比較老版本了,最新的還是自己參考文檔吧。
          主站蜘蛛池模板: 龙州县| 清河县| 雅江县| 望城县| 孝义市| 宁安市| 花莲市| 利辛县| 泸定县| 吴旗县| 普兰店市| 石嘴山市| 密云县| 宝清县| 连江县| 胶南市| 枣庄市| 壶关县| 运城市| 玛纳斯县| 博罗县| 天全县| 遂溪县| 鄂州市| 平和县| 南涧| 衡阳县| 潍坊市| 华坪县| 肥乡县| 泗水县| 琼中| 乌拉特前旗| 防城港市| 陈巴尔虎旗| 察雅县| 永寿县| 花莲市| 富裕县| 常熟市| 鄢陵县|