首頁 > 軟體

java實現圖片驗證碼

2022-04-21 19:01:12

本文範例為大家分享了java實現圖片驗證碼的具體程式碼,供大家參考,具體內容如下

目的:

1) 驗證操作者是否是人

2) 防止表單重複提交

生成驗證碼的要點:

1) 使用java程式碼生成圖片物件

BufferedImage

2) 使用Random生成隨機字串

3) 將圖片物件用

ImageIO.write(圖片物件, "jpeg|png", 響應位元組輸出流)
返回給使用者端瀏覽器

驗證驗證碼:

要點:

1) 將驗證碼文字存入session作用域

2) 表單提交時,對比session中的驗證碼和表單中的驗證碼

CaptchaUtils.java

package cn.seeker.utils;
 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.List;
 
public class CaptchaUtil {
 
    public static String [] fuhao = {"+","-","*","/"};
    public static int num = 0;
 
    //生成隨機算式
    public static String random(){
 
        List list = new ArrayList();
        Random ran = new Random();
        int n1 = ran.nextInt(10);
        int n2 = ran.nextInt(10);
        String f = fuhao[ran.nextInt(fuhao.length)];
        StringBuilder sb = new StringBuilder(4);
 
        switch (f){
            case "+":
                num = n1+n2;
                break;
            case "-":
                num =n1-n2;
                break;
            case "*":
                num = n1*n2;
                break;
            case "/":
                if(n2 == 0){
                    n2 = ran.nextInt(10)+1;
                    num = n1/n2;
                }else{
                    num = n1/n2;
                }
                break;
        }
        sb.append(n1);
        sb.append(f);
        sb.append(n2);
        sb.append("=");
 
        return sb.toString();
    }
    public static void outputImage(String str, OutputStream os){
        Random ran = new Random();
        //建立圖片物件
        BufferedImage img = new BufferedImage(100,40, BufferedImage.TYPE_INT_RGB);
        //獲取畫布
        Graphics g = img.getGraphics();
        //設定背景
        g.setColor(Color.white);
        g.fillRect(0,0,100,40);
        //寫字
        g.setColor(Color.black);
        g.setFont(new Font("微軟雅黑",Font.PLAIN,30));
        g.drawString(str,10,40);
        //隨機三條線
        g.drawLine(ran.nextInt(100),ran.nextInt(40),
                ran.nextInt(100),ran.nextInt(40));
        g.drawLine(ran.nextInt(100),ran.nextInt(40),
                ran.nextInt(100),ran.nextInt(40));
        g.drawLine(ran.nextInt(100),ran.nextInt(40),
                ran.nextInt(100),ran.nextInt(40));
        // 4. 輸出結果
        // 常見的壓縮格式:jpeg(有失真壓縮), png(無失真壓縮) ...
        try {
            ImageIO.write(img, "png", os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
 
}

regist.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/10/14
  Time: 15:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>註冊</title>
    <style>
      
        img { cursor: pointer}
    </style>
</head>
<body>
<form action="/regist" method="post">
    <img src="/captcha.png" onclick="changeImg(this)">
    輸入驗證碼:<input type="text" name="cap">
    <input type="submit" value="提交">
</form>
 
<script>
 
    function changeImg(img) {
        // 瀏覽器有一個快取特性,
        // 第一次從伺服器獲取圖片,瀏覽器第二次傳送請求時發現地址沒有改變,就會使用第一次的圖片,而不會真正傳送請求
        // 為了讓瀏覽器每次都把請求傳送給伺服器,給一個時間引數
        img.src = "/captcha.png?t="+new Date().getTime(); // 給src賦一個新值,就會向新值的地址傳送一次請求
    }
</script>
</body>
</html>

CaptchaServlet.java

package cn.seeker.controller;
 
import cn.seeker.utils.CaptchaUtil;
 
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;
 
@WebServlet(urlPatterns = "/captcha.png")
public class CaptchaServlet extends HttpServlet {
 
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
        response.setContentType("image/png");
        //獲取隨機字串
        String random = CaptchaUtil.random();
        //輸出圖片
        CaptchaUtil.outputImage(random,response.getOutputStream());
        //存入結果
        request.getSession().setAttribute("res",CaptchaUtil.num);
 
    }
 
 
}

registServlet.jsp

package cn.seeker.controller;
 
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;
 
@WebServlet(urlPatterns = "/regist")
public class registServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String cap = req.getParameter("cap");
        Integer res = (Integer)req.getSession().getAttribute("res");
        if(Integer.parseInt(cap) == res) {
            // 填寫正確,註冊成功
            req.getSession().removeAttribute("res");
            System.out.println("註冊成功");
            resp.sendRedirect("/index.jsp");
 
        } else {
            req.setAttribute("error", "驗證碼不正確");
            req.getRequestDispatcher("/jsp/regist.jsp").forward(req,resp);
        }
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com