rails實現驗證碼
網上其實有一大堆這樣的資料了,我再寫也沒多大價值,談下幾個注意點吧。
1.在windows上安裝Rmagic,如果你是通過gem安裝的,
2.網上那個例子,畫布是使用Rmagic內建的影象格式,Rmagic內建的影象格式還有:
1.在windows上安裝Rmagic,如果你是通過gem安裝的,
require 'Rmagic'
要修改為:require 'rubygems'
require 'Rmagick'
才能正確引入。require 'Rmagick'
2.網上那個例子,畫布是使用Rmagic內建的影象格式,Rmagic內建的影象格式還有:
gradient*
梯度,比如gradient:red-bluegranite
花崗石,比如: "granite:"
.
logo
logo型的影象. 如: "logo:"
,後面會多顯示一個五角星^_^
netscape
非常漂亮的彩條。如:
"netscape:"
null*
空白 使用方式: "null:"
玫瑰 使用方式
: "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
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
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">
image = session[:noisy_image].code_image
send_data image, :type => 'image/jpeg', :disposition => 'inline'
end
<img height='30' src="/test/code_image">
相關文章
- easy-captcha實現驗證碼驗證APT
- Django實現驗證碼Django
- KgCaptcha驗證碼實現筆記GCAPT筆記
- java圖形驗證碼實現Java
- Java實現郵箱驗證碼功能Java
- web動態驗證碼的實現Web
- 圖形驗證碼設計實現
- 簡單幾步實現滑動驗證碼(後端驗證)後端
- Vue.js實現圖形驗證碼Vue.js
- 【總結】Java實現簡訊驗證碼Java
- uniapp 實現簡訊驗證碼登入APP
- SpringSceurity(4)---簡訊驗證碼功能實現Spring
- 為網站實現一個驗證碼網站
- vue實現簡訊驗證碼登入Vue
- node實現登入圖片驗證碼
- 使用 Chapel 實現滑動驗證碼識別
- 基於YOLO實現滑塊驗證碼破解YOLO
- 自動化驗證碼登入如何實現?
- [Python]實現簡訊驗證碼的傳送Python
- soket 利用http實現驗證碼的傳送HTTP
- Python實現簡單驗證碼的轉文字Python
- 影片直播原始碼,前端canvas動態驗證碼實現原始碼前端Canvas
- 基於Node.js實現行為驗證碼Node.js
- 分享一個圖片驗證碼功能的實現
- Laravel 驗證碼類實現 (供學習、參考)Laravel
- Web 端 實現 app “輸入驗證碼 ”的效果WebAPP
- 簡訊驗證實現方式
- TP6實現前後端分離的圖片驗證碼,驗證碼以介面形式返回後端
- app直播原始碼,驗證時實現獲取驗證碼並顯示倒數計時的功能APP原始碼
- lumen驗證類 實現控制器場景驗證
- 如何實現直播間原始碼重要的簡訊驗證碼功能原始碼
- ZBlog關閉驗證碼功能(出現驗證碼出錯請關閉)
- 使用 Seed7 實現滑動驗證碼識別
- 使用 ActionScript 實現簡單滑動驗證碼識別
- java視窗登入介面實現隨機驗證碼Java隨機
- C#滑動拼圖驗證碼實現筆記C#筆記
- TP5 實現簡訊驗證碼註冊功能
- 使用.Net Core實現的一個圖形驗證碼
- 點選驗證碼不能實現重新整理問題