<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可能已經比較老版本了,最新的還是自己參考文檔吧。
    主站蜘蛛池模板: 亚洲欧美日韩中文二区| 亚洲日韩乱码中文无码蜜桃 | 亚洲日本va午夜中文字幕一区| 一级毛片免费不卡| 亚洲视频在线精品| 中文字字幕在线高清免费电影| 亚洲一区视频在线播放| 少妇性饥渴无码A区免费| 亚洲国产女人aaa毛片在线 | 久久午夜免费视频| 2019亚洲午夜无码天堂| 午夜视频免费观看| 免费无码午夜福利片| 亚洲一区视频在线播放| 日本免费在线观看| 亚洲伊人色一综合网| 色妞WWW精品免费视频| 美女被吸屁股免费网站| 亚洲熟妇av一区二区三区漫画| 两个人看www免费视频| 亚洲色图.com| 日韩中文无码有码免费视频| 亚洲视频在线免费| 激情内射亚洲一区二区三区| 91嫩草国产在线观看免费| 色天使色婷婷在线影院亚洲| 中文字幕亚洲综合久久菠萝蜜 | 亚洲免费视频一区二区三区| 亚洲色图在线观看| 四虎免费在线观看| 久久精品免费大片国产大片| 亚洲综合色丁香麻豆| 暖暖免费高清日本一区二区三区| 一级毛片人与动免费观看| 亚洲嫩草影院久久精品| 日韩免费高清视频网站| 日本一区二区免费看| 午夜亚洲WWW湿好爽| 久久亚洲国产精品五月天| 日本牲交大片免费观看| 日韩精品在线免费观看|