持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
在平时登录网站或者注册网站都会遇到各种各样的验证操作,比如b站的点击图片里面的文字,比如qq的输入字符串验证。为了防止恶意软件对“登录”等功能进行暴力破解,网站通常会使用验证码来增加安全性。验证码通常由一些不规则的数字、字母及线条组成,其中线条是为了防止机器人解析验证码的真实内容。
本次我们通过AJAX+AWT+servlect来完成应该简单的验证码校验。
第一步:如何得到验证码?
我们验证码不外乎是字母加数字:所以可以使用字符串,或者数组存储校验字符,然后通过random随机生成四个字符,进行校验
字符串生成验证码:
String codes="abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
String y=null;
for(int i=0;i<4;i++){
char s=codes.charAt(rs.nextInt(codes.length()));
y+=s;
}
如果是全部数字验证,可以随机生成一个四位数
//生成验证码(4位随机数字)
public String getNum() {
int ran = (int)(Math.random()*9000) +1000 ;
return String.valueOf(ran);
}
第二步:如何在前端以图片形式响应?
首先设置图片的宽高
int w=1000;
int h=1000;
然后通过:
BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
得到画布
最后使用Graphics graphics = image.getGraphics();得到画笔,接下来就可以开始作画了
通过setColor设置1画笔当前颜色,然后通过fill填充(0,0)到(h,w)区域的画布。
graphics.setColor(Color.black);
graphics.fillRect(0,0,h,w);
接下来通过设置颜色,random获取随机数字,并且画在画布。
完整代码如下
/* 在验证码图片上,随机生成60条干扰线段 线段的起始位置是(xBegin,yBegin),终止位置是(xEnd,yEnd) */
for (int i = 0; i < 60; i++) {
Random random = new Random();
int xBegin = random.nextInt(80);
int yBegin = random.nextInt(30);
int xEnd = random.nextInt(xBegin +10);
int yEnd = random.nextInt(yBegin +10);
//设置线条颜色
graphics.setColor(getColor());
//绘制线条
graphics.drawLine(xBegin, yBegin, xBegin + xEnd, yEnd + yBegin); }
//设置验证码的字体格式:字体为serif,粗体,20像素
graphics.setFont(new Font("serif", Font.BOLD,18));
//设置验证码的字体颜色为黑色
graphics.setColor(Color.BLACK);
//获取验证码(4位随机数)
String checkCode = getNum();
//在验证码的各个数字之间,增加一些间隔(空格)
StringBuffer sb = new StringBuffer();
for(int i=0;i<checkCode.length();i++){
sb.append(checkCode.charAt(i)+" ");
}
//从坐标(15,20)开始绘制验证码
graphics.drawString(sb.toString(),15,20);
//将验证码的值放入session,供后续使用
session.setAttribute("CHECKCODE",checkCode);
//将验证码绘制成jpeg格式
ImageIO.write(image,"jpeg",response.getOutputStream());
out.clear();
//表示验证码会被其他页面所引用:
//jpeg格式的验证码生成以后,会作为<img/>元素的src属性
被其他页面引用 out = pageContext.pushBody();
第三步,编写登录页面。
- 编写登录页面基本元素,并用
<img src="img.jsp"/>获取img.jsp绘制的验证码图片。 - 编写 js 程序监听 blur 事件,使得输入框失去焦点时触发校验函数。
- 在校验函数(匿名函数形式)中用 AJAX 将用户输入的校验码传递给负责比对校验的
CheckCodeServlet。 - Servlet 比对后台生成的校验码和前端传来的校验码,如果正确,则会返回“验证码正确”;如果校验失败,则返回“验证码不正确”。
- 在 AJAX 回调函数中,显示校验的结果。
需要在页面引入ajax!!!!
点击图片时候,会通过超链接重写加载图片。
//刷新验证码
function reloadCheckImg($img){
$img.attr("src","img.jsp?t="+(new Date().getTime()));
}
img.jsp就是上面我们绘制验证码的界面。
<!-- 验证码的校验结果提示图片 -->
<td id="resultTip"></td>
校验# 在服务器端对其校验,通过对输入框内容获取,然后和我们验证码对应session比较,返回不同提示