在ruby on rails中实现验证码

在windows环境下,旧版本的Rmagick安装完gem后,需要运行一个postinstall.rb来设置windows字体等。新版本的Rmagick没有这个步骤,代替是安装ImageMagick。我按照README安装成功后,在rails中使用还是出现无法读取字体的错误,忍无可忍又换了旧版本的Rmagick,没想到跟ruby的解释器版本不一致,render templage的时候出现parse error类型的错误。认真比对了下新老版本的差别,原来旧版本的Rmagick在Config目录下多了个type-windows.xml来设置windows字体,在此记录下正确的安装方法:

1.到http://rubyforge.org/frs/?group_id=12&release_id=8170,下载RMagick-1.14.1_IM-6.3.0-7-Q8.zip

2.解压后在目录执行gem install rmagick-1.14.1-win32.gem

3.最后,双击ImageMagick-6.3.0-7-Q8-windows-dll.exe安装ImageMagick

4.将ImageMagick的安装目录加进环境变量path,如果有的话就不用了
5.最后一步,将附件中的type-windows.xml拷贝进ImageMagick安装目录下的config目录,比如E:\ImageMagick-6.3.0-Q8\config,修改type.xml,原来是:


代码
<typemap> 
  <include file="type-ghostscript.xml" /> 
</typemap> 


修改为:


代码
<typemap> 
<include file="type-windows.xml" /> 
  <!-- <include file="type-ghostscript.xml" /> --> 
</typemap> 

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(4) :

ruby 代码
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]中:

def register
    session[:noisy_image] = NoisyImage.new(4) #生成一个有4字符的图片
    session[:code] = session[:noisy_image].code
  
end

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

 def code_check
    if params[:code]!=session[:noisy_image].code
         render_text "<script>document.getElementById('r_form').code.focus();</script>验证码错误!"
    else
        render_text ""
    end  
  end

controller.rb具体代码如下:

java 代码
class UserController < ApplicationController      model:noisy_image    def code_check        if params[:code]!=session[:noisy_image].code             render_text "<script>document.getElementById('r_form').code.focus();</script> 验证码错误!"       else           render_text ""       end         end    def register        session[:noisy_image] = NoisyImage.new(5) #生成一个有5字符的图片        session[:code] = session[:noisy_image].code            end            def code_image        image = session[:noisy_image].code_image        send_data image, :type => 'image/jpeg', :disposition => 'inline'      end      end  

 

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

在register.rhtml中加入以下代码:

ruby 代码
ruby 代码
"/user/code_image">  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值