验证码的使用

145 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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(); 

第三步,编写登录页面。

  1. 编写登录页面基本元素,并用 <img src="img.jsp"/> 获取 img.jsp 绘制的验证码图片。
  2. 编写 js 程序监听 blur 事件,使得输入框失去焦点时触发校验函数。
  3. 在校验函数(匿名函数形式)中用 AJAX 将用户输入的校验码传递给负责比对校验的 CheckCodeServlet
  4. Servlet 比对后台生成的校验码和前端传来的校验码,如果正确,则会返回“验证码正确”;如果校验失败,则返回“验证码不正确”。
  5. 在 AJAX 回调函数中,显示校验的结果。

需要在页面引入ajax!!!!

image.png

点击图片时候,会通过超链接重写加载图片。

//刷新验证码
function reloadCheckImg($img){
  $img.attr("src","img.jsp?t="+(new Date().getTime()));
}

img.jsp就是上面我们绘制验证码的界面。

  <!-- 验证码的校验结果提示图片 -->
<td id="resultTip"></td>

校验# 在服务器端对其校验,通过对输入框内容获取,然后和我们验证码对应session比较,返回不同提示

image.png

页面效果如下。

图片描述