rails实现验证码实例

阅读更多

主要参考了http://dennis-zane.iteye.com/blog/69400

1 安装RMagick

下载RMagick-1.14.1_IM-6.3.0-7-Q8 for win32的版本

安装ImageMagick-6.3.0-7-Q8-windows-dll.exe,为了采用这里的字体

然后安装gem包

gem install ImageMagick-6.3.0-7-Q8-windows-dll.exe

修改字体配制文件

ImageMagick-6.3.0-7-Q8-windows-dll.exe的安装目录下,有个config文件目录,修改type-ghostscript.xml文件

或者将附件里面的字体配制文件type-windows.xml拷贝到config目录,然后修改type.xml文件,来加入type-windows.xml文件 

现在可以开始使用RMagick库来生成图片了. 下面是一个验证码实例
先建立一个工程code
在app/model下,建立noisy_image.rb用来具体生成图片的一个模型
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
因为这个模型,没有和任何数据表有关系,所以不是Active:Record::Base的子类
要想rails可以知道有这个类,并且其他action可以调用这个类,需要在application.rb加入
 model:noisy_image
 
在创建一个控制器code
code_controller.rb加入
def index
    session[:noisy_image] = NoisyImage.new(4) #生成一个有4字符的图片
    session[:code] = session[:noisy_image].code
end
 
在view/code下,建立index.rhtml
登陆
<%=form_tag '/code/login'%>






输入验证码<%=text_field_tag:code%>
<%=submit_tag '提交'%>

<%=end_form_tag%>
 
通过login action来验证,通过code_image来发送图片给浏览器
下面实现code_controller.rb里面的login和code_image action
 
def code_image
    image = session[:noisy_image].code_image
    send_data image, :type => 'image/jpeg', :disposition => 'inline'
end
  
def login
    if params[:code]==session[:noisy_image].code
      @text="正确"
    else
      @text="不正确"
    end
    render:text=>@text
end
  • type-windows.zip (2.5 KB)
  • 描述: 字体配制文件
  • 下载次数: 212
  • code.rar (71.4 KB)
  • 描述: 实例的源代码
  • 下载次数: 241

你可能感兴趣的:(Rails,Ruby,rubygems,SQL,Server,C)