在ruby on rails中实现验证码

豆豆网   技术应用频道   2008年01月18日  【字号: 收藏本文

本文详细介绍在ruby on 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'
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应用的结合,和一般的验证码原理一样,将产生的随机数存储在session或者request范围内,提交的时候进行比较验证即可。比如产生图片的时候将随机字母存储在session[:code]中:

session[:noisy_image]=NoisyImage.new(6)
  
  session[:code]=session[:noisy_image].code

  验证的时候,比较提交的type_code与session[:code]即可,为了安全性考虑,最好还是不考虑使用客户端验证。

unlesssession[:code]==params[:type_code]
   flash[:notice]='验证码填写错误,请重新注册,谢谢!'
   returnredirect_to:action=>:new 
end

  在页面显示图片,类似servlet一样直接调用Controller的action:

  defcode_image
  image=session[:noisy_image].code_image
  send_dataimage,:type=>'image/jpeg',:disposition=>'inline'
 end
<imgheight='30'src="/test/code_image">

作者:killme2008    责编:豆豆技术应用

正在加载评论...