早已经实现了,现在写下来,便于以后使用。

    ValidatorImageGeneratorController.rb代码如下

ruby 代码
  1. class ValidatorImageGeneratorController < ApplicationController   
  2.      
  3.   before_filter :record_code  
  4.   skip_filter :record_url  
  5.   
  6.   def image       
  7.     if session[:code_image]   
  8.       send_data(session[:code_image], :type => 'image/jpeg')   
  9.     else  
  10.       #exception thrown   
  11.     end  
  12.   end  
  13.      
  14.   private   
  15.   def record_code   
  16.     image = ValidatorImage.new  
  17.     session[:code] = image.code   
  18.     session[:code_image] = image.code_image   
  19.   end  
  20.      
  21. end  

    ValidatorImage.rb代码如下(此文件位于app/model下面)

ruby 代码
  1. require 'rubygems'   
  2. require 'RMagick'   
  3.   
  4. class ValidatorImage   
  5.   include Magick   
  6.   attr_reader :code:code_image  
  7.   Jiggle = 5   
  8.   Wobble = 5   
  9.   Len = 4   
  10.      
  11.   def initialize   
  12.     code_array = []   
  13.     1.upto(Len) { code_array << rand(9).to_s }   
  14.     granite = Magick::ImageList.new('xc:#EDF7E7')   
  15.     canvas = Magick::ImageList.new  
  16.     canvas.new_image(20 * Len, 20, Magick::TextureFill.new(granite))   
  17.     text = Magick::Draw.new  
  18.     #text.font_family = "times"   
  19.     text.pointsize = 15   
  20.     cur = 10       
  21.     code_array.each { |c|    
  22.       rand(10) > 5 ? rot = rand(Wobble) : rot = -rand(Wobble)   
  23.       rand(10) > 5 ? weight = NormalWeight : weight = BoldWeight   
  24.       text.annotate(canvas, 0, 0, cur, 15 + rand(Jiggle), c){   
  25.         self.rotation=rot   
  26.         self.font_weight = weight   
  27.         self.fill = 'green'   
  28.       }   
  29.       cur += 20   
  30.     }   
  31.     @code = code_array.to_s   
  32.     @code_image = canvas.to_blob{ self.format = "JPG" }   
  33.   end  
  34. end  

    需要使用的时候在html的img标签中引入就可以了。    

    code_image_url方法片段:

ruby 代码
  1. def code_image_url   
  2.     url_for :controller => :validator_image_generator:action => :image  
  3. end  

    简单说明,利用RMagick插件随机生成数字,调用validator_image_generator controller 下的 image action 时候,由于record_code filter的存在,会将验证码存储在session中。验证时候从sesssion中取就可以了。

    效果图见附件:

  • 179e675e-0f46-49da-aa32-be3d9fe7401b-thumb
  • 描述:
  • 大小: 3.5 KB
评论
wzp2000 2008-07-16
执行到这一句
granite = Magick::ImageList.new('xc:#EDF7E7')
提示我:
can't convert String into Integer

这是什么原因啊?
llleelay 2008-05-22
Thanks a lot
sstt 2008-04-23
我就想拿验证码来防止这个灌水,没想到JAVAEYE的blog也没有这个功能。
sstt 2008-04-23
ggggggggggggggggg
sstt 2008-04-23
ggddddddddddddddd
wadywei 2007-11-19
在您这问个问题:我在网上下载了RMagick-1.15.9_IM-6.3.5-8-Q8_prod 安装成功ibr require 'rmagick'的返回之是true
但是在rails 的model 引用 require 'rubygems' require 'RMagick',启动服务访问页面的时候去报没有找到
core_rl_magick_.dll 这是怎么回事啊?
发表评论

您还没有登录,请登录后发表评论

cjyzpcl
搜索本博客
最近加入圈子
存档
最新评论