Java 图形验证码的生成和验证

1. 导入第三方包,主要用来生成图形验证码

       
            cn.hutool
            hutool-all
            4.6.8
        

2. 获取生成的图形验证码图片流,验证图片验证码

package com.JXWorkApi.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import com.JXWork.result.Result;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;


/**
 * 图形验证码生成
 *
 * 使用HuTool的captcha在内存中生成的验证码图片,并将绘制在图片上的验证码存放到session中用于后续验证
   最后通过OutputStream将生成的图片进行输出
   将页面提交的验证码和存放在session中的验证码对比来进行校验
 *
 * @author TF12778 2019/10/6 15:46
 */
@Controller
@RequestMapping(value = "/captcha")
public class HuToolController {

    private static Log logger = LogFactory.getLog(HuToolController.class);
    /**
     * 获取图形验证码
     * http://localhost:9999/JXWorkApi/captcha/getShearCaptcha
     * @param request
     * @param response
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/getShearCaptcha", method = RequestMethod.GET)
    public Result getShearCaptcha(HttpServletRequest request, HttpServletResponse response) {

        OutputStream out = null;
        try {
            out = response.getOutputStream();// 取得输出流
            //定义图形验证码的长、宽、验证码字符数、干扰线宽度
            ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
            //ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
            //图形验证码写出,可以写出到文件,也可以写出到流
//            captcha.write("/Users/sunww/Desktop/shear.png");
            captcha.write(out);
            //验证图形验证码的有效性,返回boolean值
            boolean checkPass = captcha.verify(captcha.getCode());
            logger.info(checkPass);
            // 将生成的验证码code放入sessoin中
            request.getSession().setAttribute("code", captcha.getCode());
            out.flush();  // 将缓存中的数据立即强制刷新, 将缓冲区的数据输出到客户端浏览器
            out.close(); // 关闭输出流

            return null;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return  new Result("error", "图片获取失败", "", null, "500" );
    }

    /**
     * 验证图形码(这一步其实可以放到登录拦截器中去做)
     * http://localhost:9999/JXWorkApi/captcha/verifyCode?code=e2xr
     * @param inCode 前端输入的图形验证码code
     * @param req
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/verifyCode", method = RequestMethod.GET)
    public Result verifyCode(String inCode, HttpServletRequest req) {

        // 获取存放在session中的验证码
        String code = (String) req.getSession().getAttribute("code");
        // 获取页面提交的验证码
//        String inputCode = req.getParameter("code");
        String inputCode = inCode;
        if(code.toLowerCase().equals(inputCode.toLowerCase())) { // 验证码不区分大小写
            return  new Result("success", "验证成功", "", null, "200" );
        }
        return  new Result("error", "验证失败", "", null, "500" );
    }
}

3. 测试结果:

获取的图片如下所示:

Java 图形验证码的生成和验证_第1张图片

图形验证码验证:

Java 图形验证码的生成和验证_第2张图片 

你可能感兴趣的:(Java)