spring mvc 集成 jcaptcha 生成图形验证码

jcaptcha是一个开源的用来生成验证码的Java开源组件

maven依赖

<dependency>  
    <groupId>com.octo.captcha</groupId>  
    <artifactId>jcaptcha</artifactId>  
    <version>1.0</version>  
</dependency>  

一般仓库中没有对应的jar,比如imaging-01012005.jar那么需要手动添加仓库

<repository>  
    <id>atlassian</id>  
    <name>atlassian</name>  
    <url>http://maven.jahia.org/maven2</url>  
    <releases>  
        <enabled>true</enabled>  
    </releases>  
    <snapshots>  
        <enabled>false</enabled>  
    </snapshots>  
</repository>  

spring配置bean

<context:component-scan base-package="com.pobaicn.ai" />
<bean id="captchaService"  
    class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">  
    <description>验证码服务</description>  
    <constructor-arg index="0">  
        <ref bean="com.pobaicn.ai.component.CSRCaptchaEngine" />  
    </constructor-arg>  
    <constructor-arg index="1">  
        <value>300</value>  
    </constructor-arg><!--超时时间 秒 -->  
    <constructor-arg index="2">  
        <value>20000</value>  
    </constructor-arg><!--最大并发数 -->  
    <constructor-arg index="3">  
        <value>20000</value>  
    </constructor-arg>  
</bean>

com.pobaicn.ai.component.CSRCaptchaEngine类

@Component("com.pobaicn.ai.component.CSRCaptchaEngine")
public class CSRCaptchaEngine extends ListImageCaptchaEngine {

    @Override
    protected void buildInitialFactories() {
        int minWordLength = 4;
        int maxWordLength = 5;
        int fontSize = 50;
        int imageWidth = 152;
        int imageHeight = 100;
        WordGenerator wordGenerator = new RandomWordGenerator(
                "0123456789abcdefghijklmnopqrstuvwxyz");
        TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,
                maxWordLength, new RandomListColorGenerator(new Color[] {
                        new Color(23, 170, 27), new Color(220, 34, 11),
                        new Color(23, 67, 172) }), new TextDecorator[] {});
        BackgroundGenerator background = new UniColorBackgroundGenerator(
                imageWidth, imageHeight, Color.white);
        FontGenerator font = new RandomFontGenerator(fontSize, fontSize,
                new Font[] { new Font("nyala", Font.BOLD, fontSize),
                        new Font("Bell MT", Font.PLAIN, fontSize),
                        new Font("Credit valley", Font.BOLD, fontSize) });

        ImageDeformation postDef = new ImageDeformationByFilters(
                new ImageFilter[] {});
        ImageDeformation backDef = new ImageDeformationByFilters(
                new ImageFilter[] {});
        ImageDeformation textDef = new ImageDeformationByFilters(
                new ImageFilter[] {});

        WordToImage word2image = new DeformedComposedWordToImage(font,
                background, randomPaster, backDef, textDef, postDef);
        addFactory(new GimpyFactory(wordGenerator, word2image));

    }

JPEGImageEncoder 这个不是jdk标准类,位于com.sun.image.codec.jpeg; 只需将jdk还成jre即可

controller层
@Controller
@RequestMapping("api")
public class ApiController extends BaseController {
    @Autowired
    private GenericManageableCaptchaService captchaService;

    @RequestMapping(value = "getCode", method = RequestMethod.GET)
    public void getCode(HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) {
        byte[] captchaChallengeAsJpeg = null;
        // 输出jpg的字节流
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
            String captchaId = httpServletRequest.getSession().getId();
            BufferedImage challenge = (BufferedImage) captchaService
                    .getChallengeForID(captchaId,
                            httpServletRequest.getLocale());

            // a jpeg encoder
            JPEGImageEncoder jpegEncoder = JPEGCodec
                    .createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
            captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

            // flush it in the response
            httpServletResponse.setHeader("Cache-Control", "no-store");
            httpServletResponse.setHeader("Pragma", "no-cache");
            httpServletResponse.setDateHeader("Expires", 0);
            httpServletResponse.setContentType("image/jpeg");
            ServletOutputStream responseOutputStream = httpServletResponse
                    .getOutputStream();
            responseOutputStream.write(captchaChallengeAsJpeg);
            responseOutputStream.flush();
            responseOutputStream.close();
        } catch (Exception e) {
            try {
                httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return;
        }
    }
}

调用方法

<img src="domin/api/getcode"  
                onclick="this.src='domin/api/getcode?d='+new Date()*1" width="160" height="30"/>  

后台校验

Boolean isCorrect = Boolean.FALSE;  
String captchaId = request.getSession().getId();  
String code = request.getParameter("code");  
try {  
    isCorrect = captchaService.validateResponseForID(captchaId,code);//true is right  
    //...dosomething
} catch (Exception e) {  
    log.error(e.getMessage());  
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值