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

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

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

    莊周夢蝶

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

    rails實現驗證碼

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

    2.網上那個例子,畫布是使用Rmagic內置的圖像格式,Rmagic內置的圖像格式還有:

    gradient*

    梯度,比如gradient:red-blue

    granite

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

    logo

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

    netscape

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

    null*

    空白 使用方式: "null:"

    rose


    玫瑰 使用方式 : "rose:"

    xc*

    設置一個背景色,比如"xc:green"


    一個修改的例子,在rails的models下存為noisy_image.rb,在Controller就可以這樣調用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應用的結合,和一般的驗證碼原理一樣,將產生的隨機數存儲在session或者request范圍內,提交的時候進行比較驗證即可。比如產生圖片的時候將隨機字母存儲在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一樣直接調用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實現驗證碼  回復  更多評論   

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

    # re: rails實現驗證碼  回復  更多評論   

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

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

    樓主知道是什么原因么?

    # re: rails實現驗證碼[未登錄]  回復  更多評論   

    2008-07-16 17:18 by dennis
    @wzp2000
    這個文章用的RMagic可能已經比較老版本了,最新的還是自己參考文檔吧。
    主站蜘蛛池模板: 亚洲欧洲自拍拍偷精品 美利坚| 无码毛片一区二区三区视频免费播放| 久久嫩草影院免费看夜色| 免费观看大片毛片| 亚洲中文无码mv| 日韩a级毛片免费视频| 校园亚洲春色另类小说合集| 午夜无遮挡羞羞漫画免费| 亚洲色偷偷色噜噜狠狠99| 国产精品无码素人福利免费| 污视频网站在线观看免费| 亚洲国产精品无码久久青草| 久久国产精品免费| 亚洲综合激情六月婷婷在线观看| 女人18毛片水真多免费看| 一区二区视频在线免费观看| 亚洲成AV人片在线播放无码| 精品久久久久久国产免费了| 日韩免费福利视频| 污视频在线免费观看| 国产精品亚洲专区无码唯爱网| 伊人久久亚洲综合| 在线a人片天堂免费观看高清| 美女被免费网站91色| 亚洲中文字幕无码久久| 国产亚洲高清不卡在线观看| 四虎影视www四虎免费| 99久久免费国产精精品| 国产亚洲综合精品一区二区三区| 久久青青草原亚洲av无码app| 夜夜嘿视频免费看| 一级毛片免费视频| 9久久免费国产精品特黄| 亚洲人成网站999久久久综合| 亚洲狠狠综合久久| 亚洲中文字幕无码一区| 日韩中文字幕在线免费观看| 三年片在线观看免费大全电影| 国产精品一区二区三区免费 | 久久精品国产亚洲AV忘忧草18 | 中国好声音第二季免费播放|