在ruby on rails中实现验证码

本文介绍如何在Rails应用中使用Rmagick生成带噪点的验证码图片,并详细解释了验证码的生成过程及与应用的结合方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
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 
" 验证码错误!"
    
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 
" 验证码错误!"   
    
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 代码
<img height="30"  src= "/user/code_image">   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值