rails实现验证码
2023-03-09 22:26:16 时间
网上其实有一大堆这样的资料了,我再写也没多大价值,谈下几个注意点吧。
1.在windows上安装Rmagic,如果你是通过gem安装的,
2.网上那个例子,画布是使用Rmagic内置的图像格式,Rmagic内置的图像格式还有:
1.在windows上安装Rmagic,如果你是通过gem安装的,
require 'Rmagic'
要修改为:
require 'rubygems'
require 'Rmagick'
才能正确引入。require 'Rmagick'
2.网上那个例子,画布是使用Rmagic内置的图像格式,Rmagic内置的图像格式还有:
gradient*
梯度,比如gradient:red-bluegranite
花岗石,比如: "granite:"
.
logo
logo型的图像. 如: "logo:"
,后面会多显示一个五角星^_^
netscape
非常漂亮的彩条。如: "netscape:"
null*
空白 使用方式: "null:"
玫瑰 使用方式 : "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
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
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">
image = session[:noisy_image].code_image
send_data image, :type => 'image/jpeg', :disposition => 'inline'
end
<img height='30' src="/test/code_image">
文章转自庄周梦蝶 ,原文发布时间5.17
相关文章
- 手绘了11张图,帮你看明白 Zookeeper 如何实现服务注册发现
- Windows上创建的文件,上传到Linux服务器,文件名乱码?
- 打造成熟的企业数据战略,拥抱混合云时代
- 数据项目成功的三个必不可少的因素
- Linux中的输入、输出和错误重定向
- 大数据与Hadoop的五大优势
- 使用 Lua 解析配置文件
- Chrome DevTools中的这些操作,你都知道吗?
- 使用 PSCP 将文件和文件夹从 Windows 传输到 Linux
- Kyligence:智能管理,让数据价值最大化
- 学习 Git,看这一篇就够了!
- 如何使用备用端口连接 ssh
- 在云中实施大数据的详情分析
- 2022年实时数据管理趋势
- Linux 中关于 ps 命令的一些常用例子
- 如何用享元模式优化系统内存?
- tee 命令是个啥?我们通过例子来看一下
- 如何将一个 Linux 命令转至后台运行?
- 如何在 Ubuntu 等 Linux 中安装 Python 3.11
- 如何让定时器在页面最小化的时候不执行?