Java实现验证码验证功能

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

猜你喜欢

转载自blog.csdn.net/Cyy19970527/article/details/83217746