java实现验证码功能,java编写验证码
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
我们先来看下效果:
(学习视频推荐:java课程)
一、适用需求
后台生成验证码,用于登陆验证。
二、实现流程
1、视图层思路
(1)输入用于输入验证码,一个图片用于展示验证码
(2)校验输入的验证码是否合格,双击图片刷新验证码,绑定onblue失去焦点事件(鼠标失去焦点时触发的事件)
(3)蓝色事件中做校验,
(4)img中的科学研究委员会属性值为后台生成验证码的方法请求路径(即请求映射的路径),当再点击验证码的时候,再动态设置科学研究委员会属性即可(原访问地址随机时间戳,防止同一路径浏览器不另做访问的问题)
注意:后台直接返回图片,不是验证码的字符!若返回字符,则验证码就失去了意义(前台很容易就可以获取验证码字符,进行多次恶意访问了)(这点考虑了系统安全性)
2、后端思路
利用图片类创建一张图片,再用图形2D对图片进行绘制(生成随机字符,添加干扰线)即可,注意:生成的验证码字符串要放到会议中,用于接下来登陆的验证码验证(当然也是后台)。
前端代码如下:
td class=tds 验证码:/td
任务描述
input type= text name= valistr onblur= checkNull( valistr ,验证码不能为空!)
img id= yzm _ img src= $ { pagecontext。请求。上下文路径}/servlet/valimgservlet style= cursor:pointer onclick= changeYZM(this)/
span id=valistr_msg/span
/td
/**
* 校验字段是否为空
*/
函数checkNull(名称,消息){
setMsg(名称,)
var v=文档。getelementsbyname(name)[0].价值;
if(v==){
setMsg(名称,消息)
返回错误的
}
返回真实的
}
/**
* 为输入项设置提示消息
*/
函数setMsg(名称,消息){
var span=文档。getelementbyid(name _ msg );
跨度。innerhtml= font color= red msg /font;
}
/**
* 点击更换验证码
*/
函数changeYZM(imgObj){
imgo bj。src=“$ { pagecontext。请求。上下文路径}/servlet/valimgservlet?时间=新日期()。getTime();
}后端代码如下:
包cn。特都。web
导入cn。特都。util。验证代码;
导入javax。servlet。servlet异常;
导入javax。servlet。http。http servlet
导入javax。servlet。http。http servlet请求;
导入javax。servlet。http。http servlet响应;
导入javax。servlet。http。http会话;
导入Java。io。io异常;
/**
* 获取验证码
*/
公共类ValiImgServlet扩展HttpServlet {
受保护的void doPost(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException {
//禁止浏览器缓存验证码
回应。设置日期头( Expires ,-1);
回应。设置标题(“缓存控制”、“无缓存”);
response.setHeader(Pragma , no-cache );
//生成验证码
验证码VC=新验证码();
//输出验证码
VC。绘制图像(响应。获取输出流());
//获取验证码的值,存储到会议中
字符串valistr=VC。get code();
http会话session=请求。getsession();
session.setAttribute(valistr ,valistr);
//打印到控制台
系统。出去。println(valistr);
}
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException {
doPost(请求、响应);
}
}包cn。特都。util
导入Java。awt。颜色;
导入Java。awt。字体;
导入Java。awt。图形2d;
导入Java。awt。形象。缓冲图像;
导入Java。io。文件;
导入Java。io。filenotfoundexception
导入Java。io。文件输出流;
导入Java。io。输出流;
导入Java。util。随机;
导入javax。imageio。imageio
/**
* 动态生成图片
*/
公共类验证码{
//{宋体, 华文楷体, 黑体, 华文新魏, 华文隶书, 微软雅黑, 楷体_GB2312}
私有静态字符串[] fontNames={ 宋体, 华文楷体, 黑体, 微软雅黑, 楷体_ GB 2312 };
//可选字符
// 23456789 abcdefghjkmnopqrstuvwxyzabcdefghjkmnpqrstuvwxyz ;
私有静态字符串代码= 23456789 abcdefghjkmnopqrstuvwxyzabcdefghjkmnpqrstuvwxyz ;
//背景色
私有颜色背景颜色=新颜色(255,255,255);
//基数(一个文字所占的空间大小)
私有int base=30
//图像宽度
private int width=base * 4;
//图像高度
private int height=base
//文字个数
private int len=4;
//设置字体大小
private int fontSize=22
//验证码上的文本
私有字符串文本;
私有BufferedImage img=null
私有图形2D g2=空
/**
* 生成验证码图片
*/
公共void绘制图像(输出流输出流){
//1.创建图片缓冲区对象,并设置宽高和图像类型
img=新缓冲区尺寸(宽度,高度,BufferedImage .TYPE _ INT _ RGB);
//2.得到绘制环境
G2=(图形2d)img。获取图形();
//3.开始画图
//设置背景色
G2。设置颜色(bgColor);
g2.fillRect(0,0,宽度,高度);
字符串缓冲区sb=新字符串缓冲区();//用来装载验证码上的文本
for(int I=0;我leni ) {
//设置画笔颜色-随机
//g2.setColor(新颜色(255,0,0));
G2。设置颜色(新颜色(getRandom(0,150),getRandom(0,150),get random(0,150)));
//设置字体
g2.setFont(新字体(fontNames[getRandom(0,fontNames.length)],字体. BOLD,font size));
//旋转文字(-45~ 45)
int theta=getRandom(-45,45);
g2 .旋转(*数学.圆周率/180.7 I *底,高-8);
//写字
字符串代码=代码。charat(get random(0,codes。length()))“”;
g2。抽绳(码,7 i *底,高-8);
某人(somebody的简写)追加(代码);
g2 .旋转(-theta * Math .圆周率/180.7 I *底,高-8);
}
这个。text=sb。tostring();
//画干扰线
for(int I=0;我借2;i ) {
//设置画笔颜色-随机
//g2.setColor(新颜色(255,0,0));
g2.setColor(新颜色(getRandom(0,150),getRandom(0,150),
getRandom(0,150)));
g2.drawLine(getRandom(0,120),getRandom(0,30),getRandom(0,120),
getRandom(0,30));
}
//TODO:
g2.setColor(颜色。灰色);
g2.drawRect(0,0,this.width-1,this。高度-1);
//4.保存图片到指定的输出流
尝试{
ImageIO.write(this.img, JPEG ,输出流);
} catch(异常e) {
e。printstacktrace();
抛出新的运行时异常(e);
}最后{
//5.释放资源
G2。dispose();
}
}
/**
* 获取验证码字符串
* @返回
*/
公共字符串getCode() {
返回这个. text
}
/*
* 生成随机数的方法
*/
私有静态int getRandom(int start,int end) {
Random Random=new Random();
返回随机的。nextint(end-start)start;
}
/*公共静态void main(String[] args)引发异常{
验证码VC=新验证码();
VC。绘制图像(新文件输出流( f:/VC。jpg’));
System.out.println(执行成功~!);
}*/
}总结:
简介:是"区分计算机和人类的全自动公共图灵测试"(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
历史:是"区分计算机和人类的全自动公共图灵测试"(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
作用:防止恶意破解密码、刷票、论坛灌水、刷页。
分类:Gif动画验证码,手机短信验证码,手机语音验证码,视频验证码
常见的验证码:
(1)四位数字和字母,可能都是字母,也可能都是数字,随机的四位字符串,最原始的验证码,验证作用几乎为零106 .程序员网站用户登录用的是GIF格式格式格式,常用的随机数字图片验证码。图片上的字符比较中规中矩,验证作用比上一个好。
(2)汉字是目前注册的最新验证码,随机生成,不易键入,如QQ申诉页面。
(3)申请3)MS的hotmail时,是BMP格式,随机数字,随机大写字母,随机干扰像素的随机位置。
(4)韩语或日语。现在用韩语在HF上注册MS比较难。
(5)谷歌的Gmail注册是JPG格式,随机英文字母,随机颜色,随机位置,随机长度。
(6)其他论坛为XBM格式,内容随意。
(7)广告验证码:只需输入广告中的部分内容。特点是能给网站带来额外收入,让用户耳目一新。广告验证码
(8)问题验证码:问题验证码主要以问答形式填写。它的视图比添加模块的验证码更容易识别和输入,系统可以生成诸如“1 ^ 2=?”让用户回答问题,当然这样的问题是随机产生的。另一种问题验证码是文本问题验证码,比如问题“中国的全称是什么?”当然,有些网站也会在提问后给出提示回答或者直接回答。
推荐:java介绍以上是使用java生成后台验证码的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。