Java实现验证码验证功能
用Java实现验证码验证功能,主要用到前台表单,Servlet,session,画板对象等
1.前台表单
先准备一个前台验证的表单,这里只写出一个简单表单实现功能.
<form action="LoginServlet">
用户名: <input type="text"><br>
密码: <input type="password"><br>
验证码: <input type="text" name="formCode">
<%-- javascript:void(0)设置该a标签点击后不跳转 --%>
<%--绑定图片点击事件--%>
<a href="javascript:void(0)" onclick="changeImg()">
<img src="MyCheckCodeServlet" id="codeImg"><br>
</a><%=request.getAttribute("msg")==null?"":request.getAttribute("msg")%>
<input type="submit" value="提交"><br>
</form>
js代码
function changeImg() {
//每点击一次验证码图片,需要访问一次servlet,起到切换图片的效果
//我们只需要改变图片的src属性,即?后拼接的内容即可
document.getElementById("codeImg").src =
"MyCheckCodeServlet?a=" + new Date().getMilliseconds();
//这里采用拼接上一个当前时间的方法,使每次点击访问servlet时,传递的参数都不同
}
2.绘制验证码的Servlet
//绘制验证码
//设置验证码 宽 高
int width = 60;
int height = 25;
//1.核心类
//三个参数 : 宽 高 图像类型
BufferedImage bufferedImage =
new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//2.获得画板对象
Graphics graphics = bufferedImage.getGraphics();
//设置画板颜色 -- 即验证码底色
graphics.setColor(Color.white);
//设置画板文字区域的边框
graphics.fillRect(1,1,width-2,height-2);
//此处设置边框起点x=1,y=1,画板宽度为width-2 高度同理
//设置画板文字字体 三个参数为: 字体,style,字体大小
graphics.setFont(new Font("楷体",20,20));
//3.设置画板文字的内容, 已知验证码包括大小写字母和数字
//所有在字符串中写出所有可能,以便之后截取获得单个目标
String tempStr = "qwertyuiopasdfghjklzxcvbnm0123456789QWERTYUIOPASDFGHJKLZXCVBNM";
//验证码需要随机从字符串中取出
Random random = new Random();
//创建一个空的code,用来放4位随机的验证码
String code = "";
//从字符串tempStr中随机取出4个字符,显示在画板中
for (int i = 0; i < 4; i++) {
//从字符串中随机一个索引值
int index = random.nextInt(tempStr.length());
//截取获得单个字符
String myTempStr = tempStr.substring(index, index + 1);
code += myTempStr;
//设置字符颜色
graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
//将字符画到图片中
//参数1:需要画到图片中的字符 参数2:x=? 参数3:一般和字体大小同值,这样可以居中
graphics.drawString(myTempStr, (width / 6) * (i + 1), 20);
}
//获得生成的code验证码数据,存入到session中,验证表单的时候,可以获得数据验证
//为什么是存入到session?这里不做解释,可以百度查询session相关特性
request.getSession().setAttribute("code",code);
//3.输出
//输出的图片 输出图片的格式 输出流
ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
3.验证码判断Servlet
//处理编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获得输入的验证码
String formCode = request.getParameter("formCode");
//验证码,存储在session中,获得session中的数据
Object code = request.getSession().getAttribute("code");
//获得验证码的一次性,验证获得验证码后,删除session中存在的code
request.getSession().removeAttribute("code");
//2.处理数据 null.toString()
if (code != null) {
if (formCode != null && formCode.equalsIgnoreCase(code.toString())) {
//验证码成功 重定向 地址栏会发生变化 不需要携带任何数据
response.sendRedirect("index.jsp");
} else {
//验证码失败
//需要把错误信息 返回给form.html
request.setAttribute("msg", "验证码输入错误");
//请求转发才可以携带数据
request.getRequestDispatcher("index.jsp")
.forward(request, response);
}
} else {
response.getWriter().print("请重新刷新浏览器");
}
Java实现验证码功能完整代码下载地址:https://download.csdn.net/download/cyy19970527/10734414