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;
    }
}


相关文章
|
3月前
|
存储 安全 Java
基于Java爬取微博数据(四) 获取 图片 or 视频
【5月更文挑战第14天】基于Java爬取微博数据(四) 图片 or 视频 下载
|
3月前
|
Java
java通过commons-fileupload实现多张图片的上传(servlet)
java通过commons-fileupload实现多张图片的上传(servlet)
|
3月前
使用ueditor实现多图片上传案例——实体类(Shopping.java)
使用ueditor实现多图片上传案例——实体类(Shopping.java)
|
3月前
|
前端开发 Java
java通过commons-fileupload实现多张图片的上传(jsp页面)
java通过commons-fileupload实现多张图片的上传(jsp页面)
|
2月前
|
数据可视化 Java
Java语言使用DL4J实现图片分类
【6月更文挑战第14天】Java语言使用DL4J实现图片分类
65 3
|
4天前
|
存储 安全 Java
"Java编码魔法:揭秘图片与文件的Base64神秘转换术,让数据在指尖跳跃!"
【8月更文挑战第16天】Base64编码在Java开发中常用于将二进制数据如图片转换为ASCII字符串以便传输。编码使用64个字符及等号填充,每3字节数据编码为4个字符。Java利用`java.util.Base64`类实现此功能:读取图片或文件为字节数组后进行编码。解码时将Base64字符串还原为字节数组并写入文件。需注意编码效率降低、不提供安全性及特殊字符兼容性等问题。掌握这些技巧有助于解决Web开发中的数据传输需求。
17 4
|
3月前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
|
5天前
|
Java
Java 图片、文件 Base64 互转
Java 图片、文件 Base64 互转
10 0
|
6天前
|
Java
JAVA PDF 截取N页,生成新文件,转图片,多个PDF 合并
JAVA PDF 截取N页,生成新文件,转图片,多个PDF 合并
12 0
|
2月前
|
Java
用java 将 jb2 文件转图片的方法
用java 将 jb2 文件转图片的方法
25 1