论坛首页 编程语言技术论坛

在ruby on rails中实现验证码

浏览 3421 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2007-09-04  

在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 代码
  1. require 'rubygems'    
  2. require 'Rmagick'   
  3. class NoisyImage   
  4.   include Magick   
  5.   attr_reader :code:code_image  
  6.   Jiggle = 15   
  7.   Wobble = 15   
  8.      
  9.   def initialize(len)   
  10.     chars = ('a'..'z').to_a - ['a','e','i','o','u']   
  11.     code_array=[]   
  12.     1.upto(len) {code_array << chars[rand(chars.length)]}   
  13.     granite = Magick::ImageList.new('xc:#EDF7E7')   
  14.     canvas = Magick::ImageList.new  
  15.     canvas.new_image(32*len, 50, Magick::TextureFill.new(granite))   
  16.     text = Magick::Draw.new  
  17.     text.font_family = 'times'   
  18.     text.pointsize = 40   
  19.     cur = 10   
  20.        
  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,30+rand(Jiggle),c){   
  25.         self.rotation=rot   
  26.         self.font_weight = weight   
  27.         self.fill = 'green'   
  28.       }   
  29.       cur += 30   
  30.     }   
  31.     @code = code_array.to_s   
  32.     @code_image = canvas.to_blob{   
  33.       self.format="JPG"    
  34.     }   
  35.   end  
  36.      
  37. end  
  38.   

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 代码
  1. class UserController < ApplicationController   
  2.   model:noisy_image   
  3. def code_check   
  4.     if params[:code]!=session[:noisy_image].code   
  5.          render_text "<script>document.getElementById('r_form').code.focus();</script> 验证码错误!"  
  6.     else  
  7.         render_text ""  
  8.     end      
  9.   end   
  10. def register   
  11.     session[:noisy_image] = NoisyImage.new(5) #生成一个有5字符的图片   
  12.     session[:code] = session[:noisy_image].code   
  13.      
  14.   end   
  15.      
  16.   def code_image   
  17.     image = session[:noisy_image].code_image   
  18.     send_data image, :type => 'image/jpeg', :disposition => 'inline'   
  19.   end   
  20.   end  

 

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

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

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

 

   发表时间:2007-09-05  
有没有不要Rmagic的验证码解决方法?
0 请登录后投票
   发表时间:2007-09-06  
无语,这不是我写的吗?拜托,你也声明下转载的
http://www.blogjava.net/killme2008/archive/2007/04/09/109456.html
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics