rails实现验证码 (3/428)

本帖地址: 复制地址

楼主: CMO涔漠

用户形象图片

rails实现验证码

    网上其实有一大堆这样的资料了,我再写也没多大价值,谈下几个注意点吧。
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(6) :


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]中:

 session[:noisy_image] = NoisyImage.new(6)

 session[:code] = session[:noisy_image].code

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

 unless session[:code]==params[:type_code]
      flash[:notice]
='验证码填写错误,请重新注册,谢谢!'

      
return redirect_to :action=>:new  
 end

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

 def code_image
    image 
=
 session[:noisy_image].code_image
    send_data image, :type 
=> 'image/jpeg', :disposition => 'inline'

  end

<img height='30' src="/test/code_image">
回到帖子顶部

1楼[楼主] CMO涔漠

用户形象图片

http://www.javaeye.com/post/405843
[原文]=========================

在ruby on rails中实现验证码 
关键字: rails   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,原来是: 


代码
  
    
  


修改为: 


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


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">    
回到帖子顶部

2楼[楼主] CMO涔漠

用户形象图片

rails实现验证码实例 
关键字:   rails     
主要参考了http://dennis-zane.javaeye.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 
回到帖子顶部

3楼Lucas

用户形象图片

现在好像可以使用 captcha了。
回到帖子顶部
个人信息
  • 荣誉+3
  • 荣誉+2
  • 荣誉+1
  • 荣誉-1
  • 荣誉-2
  • 荣誉-3
发表留言
  • 文章不错!
  • 精华好文!
  • 支持原创文章!
  • 帖子图文并茂,好!
  • 真知灼见,说得好!
  • 恶意广告
  • 违规内容
  • 严重灌水
  • 重复发帖
  • 标题党
你确定要删除此楼层吗
扣20点经验值