验证码的作用:
区分用户是计算机或人的程序,防止别人暴力对你的程序进行破坏。
验证码的实现原理:
主要就是 图片的src 设置了,验证码的导入方式,src可以是jsp,可以是html等等。
以4位数的随机数验证码进行解析。
四位数的随机数验证码:出现的分别为0-9,以及 a-z,A-Z等等。主要采用的就是Random类,例如 随机产生一个Integer值,我们将它转换为 16进制的数字,之后 就是 将这个进制的数字 截取 0-3位,总共4为数字,然后将四位数字展示在图片中。
难点:
1.如何将数据进行渲染到图片中
2.点击图片,图片进行更新,但是请求一致,如果同一时间里面,点击上百次,那么请求可能出错,也就是图片不进行更换。
注:如果一个请求处理时间为4秒,那么第一秒点击,和第3秒点击可能以为是同一个请求。
验证码难点破解:
1. 数据渲染:BufferedImage(画布), Graphics(绘画工具)
2.我们在请求的后面,添加一个随机数,作为请求的参数,但是处理url的时候,可以不需要管它。
验证码的实现:
图片产生器(jsp文件):
//create the image
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// create the Graphics
Graphics g = image.getGraphics();
// create a random instance to generate the codes
Random rdm = new Random();
// 将产生的数据 转换为 16 进制的数字
Integer number = rdm.nextInt();
String hash1 = Integer.toHexString( number );
// generate a random code
String capstr = hash1.substring(0, 4);
// 随机的四位数字(后端验证使用)
session.setAttribute("vcode", capstr);
// 设置颜色 、字体样式、
g.setColor(new Color(0, 100, 0));
g.setFont(new Font("Candara", Font.BOLD, 24));
// 数据渲染到图片上面
g.drawString(capstr, 8, 24);
// 关闭 window 界面使用资源
g.dispose();
// 通过response的方式,输出到window的浏览器界面去
response.setContentType("image/jpeg");
// 清除之前的内容
out.clear();
// 更新pagContext下面的OutStream()方法
out = pageContext.pushBody();
OutputStream strm = response.getOutputStream();
ImageIO.write(image, "jpeg", strm);
// 关闭相关资源
strm.close();
图片渲染方式:
<input type="text" id="inputCode" class='CUIydentifyCode'/>
<!-- ${pageContext.request.contextPath}/validatecode 内部的一个请求:表示validatecode.jsp界面 -->
<!-- 添加 Math.random();的理由是,防止请求方式+名字一致,然后多次请求,导致请求失效问题 -->
<img id="code" src="${pageContext.request.contextPath}/validatecode" onclick="javascript:document.getElementById('code').src='${pageContext.request.contextPath }/validatecode?' + Math.random();" /></p>
后端处理渲染方式:
/**
* 图片验证
*/
@RequestMapping("/validatecode")
public ModelAndView validatecode(HttpServletRequest request, ModelMap modelMap) {
return createModelAndView("/validatecode",modelMap);
}
/**
* * 生成一个ModelAndView(注意你的jsp在项目的位置,毕竟viewName是要和视图解析器结合处理的。)
*/
public createModelAndView(String viewName , ModelMap modelMap){
super( BASE_VIEW_NAME + viewName , modelMap ) ;
Log.debug("viewName=" + BASE_VIEW_NAME + viewName ) ;
}
以上就是 四位数的随机数的产生。需要注意的就是 Graphics 的一些函数的使用,就OK了。