java实现图片验证码全套实现方式

简介: java实现图片验证码全套实现方式

百度网盘demo提取地址:

https://pan.baidu.com/s/1dF81khN


java引用的包

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.github.bingoohuang.patchca.custom.ConfigurableCaptchaService;
import com.github.bingoohuang.patchca.filter.FilterFactory;
import com.github.bingoohuang.patchca.filter.predefined.CurvesRippleFilterFactory;
import com.github.bingoohuang.patchca.filter.predefined.DiffuseRippleFilterFactory;
import com.github.bingoohuang.patchca.filter.predefined.DoubleRippleFilterFactory;
import com.github.bingoohuang.patchca.filter.predefined.MarbleRippleFilterFactory;
import com.github.bingoohuang.patchca.filter.predefined.WobbleRippleFilterFactory;
import com.github.bingoohuang.patchca.utils.encoder.EncoderHelper;
import com.yjf.easylife.web.security.util.CaptchaFactory;

控制器代码

@Controller
@RequestMapping("/security")
public class ValidateController {
    /**
     * 日志对象
     */
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    private static final long serialVersionUID = 1L;
    private static ConfigurableCaptchaService cs = CaptchaFactory.getInstance();
    private static List<FilterFactory> factories;
    static {
        factories = new ArrayList<FilterFactory>();
        factories.add(new CurvesRippleFilterFactory(cs.getColorFactory()));
        factories.add(new MarbleRippleFilterFactory());
        factories.add(new DoubleRippleFilterFactory());
        factories.add(new WobbleRippleFilterFactory());
        factories.add(new DiffuseRippleFilterFactory());
    }
    @RequestMapping("/getImage.htm")
    public void getImage(HttpServletRequest request, HttpServletResponse response) {
        try {
            cs.setFilterFactory(factories.get(new Random().nextInt(5)));
            setResponseHeaders(response);
            Session session = SecurityUtils.getSubject().getSession();;
            String token = EncoderHelper.getChallangeAndWriteImage(cs, "png",
                response.getOutputStream());
            session.setAttribute("EASYLIFE_CAPCHA", token);
            logger.info("当前的SessionID = " + session.getId() + ",  验证码 = " + token);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void setResponseHeaders(HttpServletResponse response) {
        response.setContentType("image/png");
        response.setHeader("Cache-Control", "no-cache, no-store");
        response.setHeader("Pragma", "no-cache");
        long time = System.currentTimeMillis();
        response.setDateHeader("Last-Modified", time);
        response.setDateHeader("Date", time);
        response.setDateHeader("Expires", time);
    }

CaptchaFactory实现代码

import com.github.bingoohuang.patchca.color.RandomColorFactory;
import com.github.bingoohuang.patchca.custom.ConfigurableCaptchaService;
import com.github.bingoohuang.patchca.word.RandomWordFactory;
public class CaptchaFactory {
    private static ConfigurableCaptchaService cs = new ConfigurableCaptchaService();
    static {
        cs.setColorFactory(new RandomColorFactory());
        RandomWordFactory wf = new RandomWordFactory();
        wf.setCharacters("1234567890");
        wf.setMaxLength(4);
        wf.setMinLength(4);
        cs.setWordFactory(wf);
    }
    public static ConfigurableCaptchaService getInstance() {
        return cs;
    }
}

html代码

<html>
 <head></head>
 <body>
  <div class="p-new-in"> 
   <span class="p-new-inname">验证码</span>
   <input type="text" name="customCaptcha" class="p-new-input p-new-w177" placeholder="请输入图片验证码" /> 
   <span class="p-new-code l-mar-r15"> <img src="/security/getImage.htm" class="reloadImage" id="reloadImage" width="121" height="40" /> </span> 
   <a href="javaScript:;" class="l-color9 reloadImage">看不清楚,换一张</a> 
  </div>
 </body>
</html>

js代码

$(".reloadImage").click(function () {
    //获取当前的时间作为参数,无具体意义
    var timenow = new Date().getTime();
    $('#reloadImage').attr("src", "/security/getImage.htm?date=" + timenow);
});

判断验证码是否正确

/**
 *
 * Created by cike-zihao on 2015/11/25
 */
package com.yjf.easylife.common.util;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by cike-zihao on 2015/11/25.
 */
public class SecurityCodeUtil {
    public static boolean whetherImgCaptchaMatch(String customCaptcha,
        HttpServletRequest request) {
        boolean captchaMatch = true;
        String requestCaptcha = (String) request.getSession()
                                                .getAttribute("EASYLIFE_CAPCHA");
        if (!StringUtils.equals(customCaptcha, requestCaptcha)) {
            captchaMatch = false;
        }
        return captchaMatch;
    }
}


相关文章
|
2月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
77 4
|
2月前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
62 2
|
2月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
50 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
2月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
101 1
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
21 1
|
2月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
70 1
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
114 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
30 1
|
2月前
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
38 1
|
3月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝