#产生随机的密码
def generate_password
chars = ("a".."z").to_a + ("0".."9").to_a
#puts chars
Array.new(6, '').collect{chars[rand(chars.size)]}.join
end
#测试
puts generate_password
From:
http://qichunren.javaeye.com/blog/208773
----------------------------------------
Rails实现随机验证码 :
ruby 代码
- class ValidatorImageGeneratorController < ApplicationController
- before_filter :record_code
- skip_filter :record_url
- def image
- if session[:code_image]
- send_data(session[:code_image], :type => ’image/jpeg’)
- else
- #exception thrown
- end
- end
- private
- def record_code
- image = ValidatorImage.new
- session[:code] = image.code
- session[:code_image] = image.code_image
- end
- end
ValidatorImage.rb代码如下(此文件位于app/model下面)
ruby 代码
- require ’rubygems’
- require ’RMagick’
- class ValidatorImage
- include Magick
- attr_reader :code, :code_image
- Jiggle = 5
- Wobble = 5
- Len = 4
- def initialize
- code_array = []
- 1.upto(Len) { code_array << rand(9).to_s }
- granite = Magick::ImageList.new(’xc:#EDF7E7′)
- canvas = Magick::ImageList.new
- canvas.new_image(20 * Len, 20, Magick::TextureFill.new(granite))
- text = Magick::Draw.new
- #text.font_family = ”times”
- text.pointsize = 15
- 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, 15 + rand(Jiggle), c){
- self.rotation=rot
- self.font_weight = weight
- self.fill = ’green’
- }
- cur += 20
- }
- @code = code_array.to_s
- @code_image = canvas.to_blob{ self.format = ”JPG” }
- end
- end
需要使用的时候在html的img标签中引入就可以了。
code_image_url方法片段:
ruby 代码
- def code_image_url
- url_for :controller => :validator_image_generator, :action => :image
- end
简单说明,利用RMagick插件随机生成数字,调用validator_image_generator controller 下的 image action 时候,由于record_code filter的存在,会将验证码存储在session中。验证时候从sesssion中取就可以了
#2
class Part < ActiveRecord::Base
require ‘RMagick’
require “cgi”
include Magick
attr_reader :code , :code_image # 类的 2 个属性
Jiggle = 15
Wobble = 15
def initialize(len)
#chars = (’a’..’z').to_a-['a','e','i','o','u']
code_array=[]
codex=”"
rr=0
1 .upto(5 ) {
rr=65 +rand(25 )
code_array << rr
} #随机生成5个大写字母
#code_array=[rand(rr).chr,rand(rr).chr,rand(rr).chr,rand(rr).chr]
#1.upto(len) {code_array << chars[rand(chars.length)]}
granite = Magick::ImageList.new (’granite:’) #生成granite样式的背景
canvas = Magick::ImageList.new # 定义一个画布
canvas.new_image(24 *4 ,20 , Magick::TextureFill.new (granite)) #granite放画布上
text = Magick::Draw.new # 文字
#text.font_family = ‘times’
text.pointsize = 20 # 文字大小
cur = 10
code_array.each {|c|
c=c.to_i
c=c.chr
codex=codex+c #acs码(数字)转为字母
#rand(10) > 5 ? rot=rand(Wobble):rot= -rand(Wobble)
rand(10 ) > 5 ? weight = NormalWeight : weight = BoldWeight
ra=1000
while ra<100000
ra=rand(999999 )
end
rn=’#'+ra.to_s
text.annotate(canvas,20 ,20 , cur,18 ,c){ #text对象放canvas上
self.rotation=rand(30 ) #旋转角度
self.font_weight = weight
self.fill = rn #text(文字)颜色
}
cur += 15
}
@code = codex #生成文字(字符串格式)
@code_image = canvas.to_blob{ #生成图片(二进制格式)
self.format=”JPG”
}
end
#3
rails 实现验证码
网上其实有一大堆这样的资料了,我再写也没多大价值,谈下几个注意点吧。
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”>
From:
http://wanguan2000.blog.ubuntu.org.cn/2008/09/19/rails%E5%AE%9E%E7%8E%B0%E9%9A%8F%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81/