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 " >
文章转自庄周梦蝶  ,原文发布时间5.17
目录
相关文章
|
API PHP 开发工具
laravel中短信发送验证码的实现方法
在做用户注册和个人中心的安全管理时常常需要用到短信发送验证码,下面这篇文章主要给大家介绍了关于laravel中短信发送验证码的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
3609 0
python+selenium 通过添加cookies或token解决网页上验证码登录问题
cookie或token可以保存登录信息,当我们拿到cookie后,可以通过向浏览器发送cookie中记录的数据,直接变成登录状态,不需要再登录。
1929 0
|
安全 前端开发 定位技术
推荐一个非常好的行为验证码项目!
KgCaptcha 结合了设备指纹、行为特征、访问频率、地理位置等多项技术,有效的拦截恶意登录、批量注册,阻断机器操作,拦截非正常用户。较传统验证码相比,用户无需再经过思考或输入操作,只需轻轻一滑即可进行验证。
推荐一个非常好的行为验证码项目!
|
缓存 JavaScript Java
web验证码的生成以及验证
web验证码的生成以及验证
246 0
web验证码的生成以及验证
|
存储
easyswoole 验证码使用
easyswoole 验证码使用
85 0
|
文字识别 测试技术 API
Selenium获取动态图片验证码
Selenium获取动态图片验证码
634 0
Selenium获取动态图片验证码
|
PHP
laravel怎么加入验证码功能
laravel怎么加入验证码功能
135 0
laravel怎么加入验证码功能
|
前端开发 PHP
Laravel8 使用图形验证码做登录
一、 安装扩展包 composer require gregwar/captcha
|
PHP
【laravel项目】@2 账号密码登录验证(1)
【laravel项目】@2 账号密码登录验证
67 0
【laravel项目】@2 账号密码登录验证(1)
|
PHP
【laravel项目】@2 账号密码登录验证(2)
【laravel项目】@2 账号密码登录验证
64 0
【laravel项目】@2 账号密码登录验证(2)