代码片断:在Ruby中产生随机的密码

 #产生随机的密码 
    def generate_password     
       chars = ("a".."z").to_a + ("0".."9").to_a 
       #puts chars 
       Array.new(6, '').collect{chars[rand(chars.size)]}.join   
     end 
     
   #测试  
   puts generate_password 

 

 

From:

http://qichunren.javaeye.com/blog/208773

 

 

----------------------------------------

Rails实现随机验证码

 

ruby 代码

  1. class ValidatorImageGeneratorController < ApplicationController   
  2.      
  3.   before_filter :record_code  
  4.   skip_filter :record_url  
  5.   
  6.   def image       
  7.     if session[:code_image]   
  8.       send_data(session[:code_image], :type => ’image/jpeg’)   
  9.     else  
  10.       #exception thrown   
  11.     end  
  12.   end  
  13.      
  14.   private   
  15.   def record_code   
  16.     image = ValidatorImage.new  
  17.     session[:code] = image.code   
  18.     session[:code_image] = image.code_image   
  19.   end  
  20.      
  21. end  

ValidatorImage.rb代码如下(此文件位于app/model下面)

ruby 代码

  1. require ’rubygems’   
  2. require ’RMagick’   
  3.   
  4. class ValidatorImage   
  5.   include Magick   
  6.   attr_reader :code, :code_image  
  7.   Jiggle = 5   
  8.   Wobble = 5   
  9.   Len = 4   
  10.      
  11.   def initialize   
  12.     code_array = []   
  13.     1.upto(Len) { code_array << rand(9).to_s }   
  14.     granite = Magick::ImageList.new(’xc:#EDF7E7′)   
  15.     canvas = Magick::ImageList.new  
  16.     canvas.new_image(20 * Len, 20, Magick::TextureFill.new(granite))   
  17.     text = Magick::Draw.new  
  18.     #text.font_family = ”times”   
  19.     text.pointsize = 15   
  20.     cur = 10       
  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, 15 + rand(Jiggle), c){   
  25.         self.rotation=rot   
  26.         self.font_weight = weight   
  27.         self.fill = ’green’   
  28.       }   
  29.       cur += 20   
  30.     }   
  31.     @code = code_array.to_s   
  32.     @code_image = canvas.to_blob{ self.format = ”JPG” }   
  33.   end  
  34. end  

需要使用的时候在html的img标签中引入就可以了。    

    code_image_url方法片段:

ruby 代码

  1. def code_image_url   
  2.     url_for :controller => :validator_image_generator, :action => :image  
  3. end  

简单说明,利用RMagick插件随机生成数字,调用validator_image_generator controller 下的 image action 时候,由于record_code filter的存在,会将验证码存储在session中。验证时候从sesssion中取就可以了

#2

class Part < ActiveRecord::Base

require ‘RMagick’

require “cgi”

 

include Magick

attr_reader :code , :code_image  # 类的 2 个属性

  Jiggle = 15

  Wobble = 15

def initialize(len)

  #chars = (’a’..’z').to_a-['a','e','i','o','u']

  code_array=[]

  codex=”"

  rr=0

  1 .upto(5 ) {

    rr=65 +rand(25 )

    code_array << rr

    }            #随机生成5个大写字母

  #code_array=[rand(rr).chr,rand(rr).chr,rand(rr).chr,rand(rr).chr]

  #1.upto(len) {code_array << chars[rand(chars.length)]}

  granite = Magick::ImageList.new (’granite:’)    #生成granite样式的背景

  canvas = Magick::ImageList.new    # 定义一个画布

  canvas.new_image(24 *4 ,20 , Magick::TextureFill.new (granite))   #granite放画布上

  text = Magick::Draw.new    # 文字

  #text.font_family = ‘times’

  text.pointsize = 20                  # 文字大小

  cur = 10

  code_array.each {|c|

     c=c.to_i

     c=c.chr

     codex=codex+c               #acs码(数字)转为字母

    #rand(10) > 5 ? rot=rand(Wobble):rot= -rand(Wobble)

    rand(10 ) > 5 ? weight = NormalWeight : weight = BoldWeight

    ra=1000

    while ra<100000

        ra=rand(999999 )

    end

    rn=’#'+ra.to_s

    text.annotate(canvas,20 ,20 , cur,18 ,c){      #text对象放canvas上

      self.rotation=rand(30 )                     #旋转角度

      self.font_weight = weight

 

      self.fill = rn                              #text(文字)颜色

    }

    cur += 15

  }

  @code = codex                                #生成文字(字符串格式)

 

  @code_image = canvas.to_blob{              #生成图片(二进制格式)

    self.format=”JPG”

  }

end

 

#3

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”>

 

From:

http://wanguan2000.blog.ubuntu.org.cn/2008/09/19/rails%E5%AE%9E%E7%8E%B0%E9%9A%8F%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值