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'%>
<table>
<tr>
<td>输入验证码</td><td><%=text_field_tag:code%></td>
</tr>
<tr><td><img height='30' src="/code/code_image"></td></tr>
<tr><td><%=submit_tag '提交'%></td></tr>
</table>
<%=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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值