Java Web 简单实现验证码

今天学习JavaWeb简单实现了验证码,记录一下。。
验证码展示出来为一张图片,其中包括验证码本身(数字)以及干扰线条,使用画笔绘制。话不多说,直接展示代码:

绘制验证码的img.jsp

<%@ page import="java.awt.*" %>
<%@ page import="java.util.Random" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO" %>
<%@ page contentType="image/jpeg;charset=UTF-8" language="java" %>
<%!
    //随机产生颜色值
    public Color getColor() {
    
    
        Random random = new Random();
        int r = random.nextInt(256);
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        return new Color(r, g, b);
    }

    //产生验证码值
    public String getNum() {
    
    
        int ran = (int)(Math.random() * 9000) + 1000;
        return String.valueOf(ran);
    }
%>
<%
    //禁止缓存,防止验证码过期
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-control", "no-cache");
    response.setHeader("Expires", "0");
    //绘制验证码
    BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
    //画笔
    Graphics graphics = image.getGraphics();
    graphics.fillRect(0, 0, 80, 30);
    //绘制干扰线条
    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, xEnd, yEnd);
    }
    graphics.setFont(new Font("seif", Font.BOLD, 20));
    //绘制验证码
    graphics.setColor(Color.BLACK);
    String checkCode = getNum();
    StringBuilder stringBuffer = new StringBuilder();
    for (int i = 0; i < checkCode.length(); i++) {
    
    
        stringBuffer.append(checkCode.charAt(i)).append(" ");
    }
    graphics.drawString(stringBuffer.toString(), 15, 20);
    //将验证码真实值 保存在session中,供使用时比较真实性
    session.setAttribute("checkCode", checkCode);
    //真实地产生图片
    ImageIO.write(image, "jpeg", response.getOutputStream());

    //关闭
    out.clear();
    out = pageContext.pushBody();
%>

使用验证码index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>验证码</title>
    <script type="text/javascript" src="jquery-1.4.2.js"></script>
    <script>
      function reloadCheckImg() {
    
    
      //这里加上后面的是为了保证每次请求都是不一样的
        $("#checkCodeImg").attr("src", "img.jsp?t="+(new Date().getTime()));
      }
      //文档就绪函数
      $(document).ready(function () {
    
    
        $("#checkCodeId").blur(function () {
    
    
	        //获取用户输入的验证码值
            var $checkCode = $("#checkCodeId").val();
            //向服务端发送post请求
            $.post("CheckCodeServlet", {
    
    "checkCode":$checkCode}, function (result) {
    
    
              var rsHTMl = $("<img src='" + result + "' height='15px' width='15px' />")
              $("#tip").html(rsHTMl)
            });
        });
      });
    </script>
  </head>
  <body>
    <!-- 验证码 -->
    <a href="javascript:reloadCheckImg();"> <img id="checkCodeImg" src="img.jsp"  alt="验证码"/> </a> <br/>
    验证码:<input type="text" name="checkCode" id="checkCodeId" size="4">
    <span id="tip"></span>
  </body>
</html>

最后是处理用户输入验证码的Servlet:

package pers.kuroko.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(value = "/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    	//设置默认返回信息
        String resultTip = "imgs/wrong.jpg";
        //获取用户输入
        String checkCodeClient = request.getParameter("checkCode");
        //从session中获取验证码真实值
        String checkCodeServer = (String) request.getSession().getAttribute("checkCode");
        if (checkCodeClient.equals(checkCodeServer)) {
    
    
            resultTip = "imgs/right.jpg";
        }
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.write(resultTip);
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

运行结果:
在这里插入图片描述
当验证码输入错误时,在旁边显示一个叉
在这里插入图片描述
当验证码输入正确时,在旁边显示对勾
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44215175/article/details/107658484