分享Ruby on rails實(shí)現(xiàn)驗(yàn)證碼技巧
Ruby on rails的應(yīng)用可以幫助編程人員快速簡(jiǎn)便靈活的實(shí)現(xiàn)各種代碼編程。那么今天我們就來(lái)看看Ruby on rails實(shí)現(xiàn)驗(yàn)證碼的相關(guān)技巧方法。#t#
1.在windows上安裝Rmagic,如果你是通過(guò)gem安裝的
require'Rmagic'
要修改為:
require'rubygems'
require'Rmagick'
才能正確引入。
2.網(wǎng)上那個(gè)Ruby on rails實(shí)現(xiàn)驗(yàn)證碼例子,畫布是使用Rmagic內(nèi)置的圖像格式,Rmagic內(nèi)置的圖像格式還有:
gradient*梯度,比如gradient:red-blue
granite
花崗石,比如: "granite:".
logo
logo型的圖像. 如: "logo:",后面會(huì)多顯示一個(gè)五角星^_^
netscape
非常漂亮的彩條。如: "netscape:"
null*
空白 使用方式: "null:"
rose
玫瑰 使用方式 : "rose:"
xc*
設(shè)置一個(gè)背景色,比如"xc:green"
一個(gè)修改的Ruby on rails實(shí)現(xiàn)驗(yàn)證碼例子,在rails的models下存為noisy_image.rb,在Controller就可以這樣調(diào)用NoisyImage.new(6) :
- require'rubygems'
- require'Rmagick'
- classNoisyImage
- includeMagick
- attr_reader:code,:code_image
- Jiggle=15
- Wobble=15
- definitialize(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é)合,和一般的驗(yàn)證碼原理一樣,將產(chǎn)生的隨機(jī)數(shù)存儲(chǔ)在session或者request范圍內(nèi),提交的時(shí)候進(jìn)行比較驗(yàn)證即可。比如產(chǎn)生圖片的時(shí)候?qū)㈦S機(jī)字母存儲(chǔ)在session[:code]中:
- session[:noisy_image]=
NoisyImage.new(6)- session[:code]=session
[:noisy_image].code
Ruby on rails實(shí)現(xiàn)驗(yàn)證碼在進(jìn)行驗(yàn)證的時(shí)候,比較提交的type_code與session[:code]即可,為了安全性考慮,***還是不考慮使用客戶端驗(yàn)證。
- unlesssession[:code]
==params[:type_code]- flash[:notice]=
'驗(yàn)證碼填寫錯(cuò)誤,請(qǐng)重新注冊(cè),謝謝!'- returnredirect_to:action=>:new
- end
在頁(yè)面顯示圖片,類似servlet一樣直接調(diào)用Controller的action:
- defcode_image
- image=session[:noisy_image].code_image
- send_dataimage,:type=>
'image/jpeg',:disposition=>'inline'- end
- < imgheightimgheight='30'
src="/test/code_image">
Ruby on rails實(shí)現(xiàn)驗(yàn)證碼的相關(guān)技巧方法就為大家介紹到這里。