天天看點

rails實作驗證碼

  網上其實有一大堆這樣的資料了,我再寫也沒多大價值,談下幾個注意點吧。

1.在windows上安裝rmagic,如果你是通過gem安裝的,

require 'rmagic'

要修改為:

require 'rubygems'

require 'rmagick'

才能正确引入。

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

梯度,比如gradient:red-blue

花崗石,比如: <code>"granite:"</code>.

logo型的圖像. 如: <code>"logo:"</code>,後面會多顯示一個五角星^_^

非常漂亮的彩條。如: <code>"netscape:"</code>

空白 使用方式: <code>"null:"</code>

rose

玫瑰 使用方式 : <code>"rose:"</code>

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

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

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 &lt;&lt; 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) &gt; 5 ? rot=rand(wobble):rot= -rand(wobble)

      rand(10) &gt; 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=&gt;:new  

 end

在頁面顯示圖檔,類似servlet一樣直接調用controller的action:

 def code_image

    image = session[:noisy_image].code_image

    send_data image, :type =&gt; 'image/jpeg', :disposition =&gt; 'inline'

&lt;img height='30' src="/test/code_image"&gt;

文章轉自莊周夢蝶  ,原文釋出時間5.17