java写一个验证码,JAVA验证码生成
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
在我们的日常生活中验证码随处可见,它可以在一定程度上保护我们的账号安全,那么如何实现它呢?
(学习视频推荐:java课程)
爪哇实现验证码验证功能其实非常简单:用到了一个制图法类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。
首先,写一个验证码生成帮助类,用来绘制随机字母:
导入Java。awt。颜色;
导入Java。awt。字体;
导入Java。awt。图形;
导入Java。awt。形象。缓冲图像;
导入Java。io。io异常;
导入Java。io。输出流;
导入Java。util。随机;
导入javax。imageio。imageio
公共最终类图形编辑器{
/**
* 以字符串形式返回生成的验证码,同时输出一个图片
*
* @param宽度
* 图片的宽度
* @param高度
* 图片的高度
* @param imgType
* 图片的类型
* @param输出
* 图片的输出流(图片将输出到这个流中)
* @返回返回所生成的验证码(字符串)
*/
public static String create(final int width,final int height,final String imgType,OutputStream output) {
字符串缓冲区sb=新字符串缓冲区();
Random Random=new Random();
BufferedImage=新的buffered image(宽度,高度,BufferedImage .TYPE _ INT _ RGB);
图形图形=图像。获取图形();
图形。设置颜色(颜色。getcolor( F8F8 );
graphic.fillRect(0,0,width,height);
Color[] colors=新颜色[] { Color .蓝色,彩色。灰色,彩色。绿色,彩色。红色,彩色。黑色,彩色。橙色,
颜色。青色};
//在画板上生成干扰线条( 50 是线条个数)
for(int I=0;i 50i ) {
图形。设置颜色(颜色[随机。nextint(颜色。长度)]);
final int x=random。nextint(宽度);
final int y=random。nextint(高度);
最终int w=random。nextint(20);
最终int h=random。nextint(20);
最终int signA=random。下一个布尔()?1 : -1;
最终整数B=随机。下一个布尔()?1 : -1;
graphic.drawLine(x,y,x w * signA,y h * signB);
}
//在画板上绘制字母
graphic.setFont(新字体(‘漫画无MS’,字体。粗体,30));
for(int I=0;i6;i ) {
最终整数温度=随机。nextint(26)97;
字符串s=字符串。((char)temp)的值;
某人追加;
图形。设置颜色(颜色[随机。nextint(颜色。长度)]);
graphic.drawString(s,i *(宽度/6),高度-(高度/3));
}
图形。dispose();
尝试{
ImageIO.write(image,imgType,output);
} catch (IOException e) {
e。printstacktrace();
}
归还某人。tostring();
}
}接着,创建一个servlet,用来固定图片大小,以及处理验证码的使用场景,以及捕获页面生成的验证码(捕获到的二维码与用户输入的验证码一致才能通过)。
导入Java。io。io异常;
导入Java。io。输出流;
导入javax。servlet。servlet异常;
导入javax。servlet。注释。web servlet
导入javax。servlet。http。http servlet
导入javax。servlet。http。http servlet请求;
导入javax。servlet。http。http servlet响应;
导入javax。servlet。http。http会话;
@ web servlet(URL patterns=/verify/regist。do’)
公共类VerifyCodeServlet扩展HttpServlet {
private static final long serial版本uid=3398560501558431737 l;
@覆盖
受保护的空的服务(HttpServletRequest请求,HttpServletResponse响应)
引发ServletException,IOException {
//获得当前请求对应的会话对象
http会话session=请求。getsession();
//从请求中获得URI(统一资源标识符)
字符串uri=请求。get request uri();
系统。出去。println( hello: uri );
最终int width=180//图片宽度
最终int height=40//图片高度
最终字符串imgType= jpeg//指定图片格式(不是指哑剧类型)
最终输出流输出=响应。获取输出流();//获得可以向客户端返回图片的输出流
//(字节流)
//创建验证码图片并返回图片上的字符串
字符串代码=图形助手。创建(宽度,高度,imgType,输出);
System.out.println(验证码内容: 代码);
//建立上呼吸道感染和相应的验证码的关联(存储到当前会话对象的属性中)
session.setAttribute(uri,代码);
系统。出去。println(会话。get属性(uri));
}
}(相关教程推荐:java入门)
接着写一个超文本标记语言注册页面用来检验一下:
!声明文档类型
超文本标记语言
头
meta charset=UTF-8
标题注册/标题
link rel=样式表 href= styles/general。 CSS
link rel=样式表 href=样式/单元格。 CSS
链接rel=样式表 href=样式/表单。 CSS
脚本类型= text/JavaScript src= js/ref。js /脚本
style type=text/css 。徽标-容器{
边距-顶部:50px
}。徽标-集装箱img {
宽度:100像素
}。消息容器{
高度:80px
}。链接容器{
高度:40px
行高:40px
}。链接-容器一个{
文字-装饰:无;
}
/风格
/头
身体
div class=容器形式-容器
窗体action=/闻道/regist.do 方法=post
div class=form !-注册表单开始-
div class=form-row
span class=单元格-1
i class=fa fa-user/i
/span
span class= cell-11 style= text-align:left;
输入类型= text name= username placeholder=请输入用户名
/span
/div
div class=form-row
span class=单元格-1
I=fa fa-key/I
/span
span class= cell-11 style= text-align:left;
输入类型=密码名称=密码占位符=请输入密码
/span
/div
div class=form-row
span class=单元格-1
I= fa fa-keyboard-o /I
/span
span class= cell-11 style= text-align:left;
输入类型=密码名称=确认占位符=请确认密码
/span
/div
div class=form-row
span class=cell-7
输入类型= text name=验证码 placeholder=请输入验证码
/span
span class= cell-5 style= text-align:center;
img src=/demo/verify/regist。不要点击=我的参考(这个)
/span
/div
div class= form-row style= border:none;
span class= cell-6 style= text-align:left
输入类型=重置值=重置
/span
span class= cell-6 style= text-align:right;
输入类型=提交值=注册
/span
/div
/div!-注册表单结束-
/表单
/div
/body
/html效果图:
在控制台接收到的图片中验证码的变化如下:
当点击刷新页面的时候,验证码也会随着变化,但我们看不清验证码时,只要点击验证码就会刷新,这样局部的刷新可以用Java脚本语言来实现。
在img src=/demo/verify/register . do 中,添加一个问号和一串后缀数字。刷新时后缀数字会不断变化,形成的验证码也会不断变化。我们可以采用的一种方式是把后缀数字换成日期,这样会得到当地时间,时间会随时变化,这样就保证了刷新验证码可以随时变化。
代码如下:
函数myRefersh( e ) {
const源=e.src//获取原始src中的内容
//console . log( source: source );
var index=source.indexOf(?)) ;//从源头找?第一次出现的位置(如果不存在,返回-1)
//console . log( index: index );
If( index -1) {//如果找到?进去吧。
var s=source.substring( 0,index);//从源中截取索引之前的内容(索引和索引之后的内容被丢弃)
//console . log( s: s );
var Date=new Date();//创建日期对象的实例
var time=date . gettime();//从新创建的Date对象实例中获取该时间对应的毫秒值
e.src=s ?时间=时间;//将尾地址放回src上
//console . log(e . src);
}否则{
var Date=new Date();
e.src=source ?time= date . gettime();
}
}以上是用java实现一个验证码功能的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。