`
胡桃同学
  • 浏览: 23224 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringMVC中使用Jcaptcha实现校验码验证

 
阅读更多

本文将使用Jcaptcha实现校验码验证,并演示在Spring/SpringMVC环境下的使用方法。

 

1. maven依赖

<dependency>
    <groupId>com.octo.captcha</groupId>
    <artifactId>jcaptcha-all</artifactId>
    <version>1.0-RC6</version>
    <exclusions>
        <exclusion>
            <groupId>quartz</groupId>
            <artifactId>quartz</artifactId>
        </exclusion>
        <exclusion>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
        </exclusion>
        <exclusion>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            </exclusion>
        <exclusion>
            <groupId>hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
        </exclusion>
        <exclusion>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </exclusion>
        <exclusion>
            <groupId>concurrent</groupId>
            <artifactId>concurrent</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
        </exclusion>
        <exclusion>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
        </exclusion>
        <exclusion>
            <groupId>xerces</groupId>
            <artifactId>xmlParserAPIs</artifactId>
        </exclusion>
    </exclusions>
</dependency>

 注:请按需对需要排除的依赖进行增减

 

2. 需要将Jcaptcha的Bean加入Spring管理,故新增Spring-Jcaptcha的配置文件。web.xml中

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath*:applicationContext.xml
        classpath*:applicationContext-captcha.xml
    </param-value>
</context-param>

 

3. applicationContext-captcha.xml的内容

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-lazy-init="true">

    <bean id="captchaService" class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">
        <constructor-arg index="0" ref="imageEngine" />
        <constructor-arg type="int" index="1" value="180" />
        <constructor-arg type="int" index="2" value="100000" />
    </bean>

    <bean id="imageEngine" class="com.octo.captcha.engine.GenericCaptchaEngine">
        <constructor-arg index="0">
            <list>
                <ref bean="captchaFactory" />
            </list>
        </constructor-arg>
    </bean>

    <bean id="captchaFactory" class="com.octo.captcha.image.gimpy.GimpyFactory">
        <constructor-arg>
            <ref bean="wordgen" />
        </constructor-arg>
        <constructor-arg>
            <ref bean="wordtoimage" />
        </constructor-arg>
    </bean>

    <bean id="wordgen" class="com.octo.captcha.component.word.wordgenerator.RandomWordGenerator">
        <!--可选字符-->
        <constructor-arg>
            <value>
                0123456789abcdefghijklmnopqrstuvwxyz
            </value>
        </constructor-arg>
    </bean>

    <bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage">
        <constructor-arg index="0">
            <ref bean="fontGenRandom" />
        </constructor-arg>
        <constructor-arg index="1">
            <ref bean="backGenUni" />
        </constructor-arg>
        <constructor-arg index="2">
            <ref bean="decoratedPaster" />
        </constructor-arg>
    </bean>

    <bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator">
        <!--最小字体-->
        <constructor-arg index="0">
            <value>20</value>
        </constructor-arg>
        <!--最大字体-->
        <constructor-arg index="1">
            <value>20</value>
        </constructor-arg>
        <constructor-arg index="2">
            <list>
                <bean class="java.awt.Font">
                    <constructor-arg index="0">
                        <value>Arial</value>
                    </constructor-arg>
                    <constructor-arg index="1">
                        <value>0</value>
                    </constructor-arg>
                    <constructor-arg index="2">
                        <value>20</value>
                    </constructor-arg>
                </bean>
            </list>
        </constructor-arg>
    </bean>

    <bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator">
        <!--背景宽度-->
        <constructor-arg index="0">
            <value>80</value>
        </constructor-arg>
        <!--背景高度-->
        <constructor-arg index="1">
            <value>32</value>
        </constructor-arg>
    </bean>

    <bean id="decoratedPaster" class="com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster">
        <!--最大字符长度-->
        <constructor-arg type="java.lang.Integer" index="0">
            <value>4</value>
        </constructor-arg>
        <!--最小字符长度-->
        <constructor-arg type="java.lang.Integer" index="1">
            <value>4</value>
        </constructor-arg>
        <!--文本颜色-->
        <constructor-arg index="2">
            <ref bean="colorGen" />
        </constructor-arg>
        <!--文本混淆-->
        <constructor-arg index="3">
            <list>
                <!--<ref bean="baffleDecorator"/>-->
            </list>
        </constructor-arg>
    </bean>

    <bean id="baffleDecorator" class="com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator">
        <constructor-arg type="java.lang.Integer" index="0">
            <value>1</value>
        </constructor-arg>
        <constructor-arg type="java.awt.Color" index="1">
            <ref bean="colorWrite" />
        </constructor-arg>
    </bean>

    <bean id="colorGen" class="com.octo.captcha.component.image.color.SingleColorGenerator">
        <constructor-arg type="java.awt.Color" index="0">
            <ref bean="colorDimGrey" />
        </constructor-arg>
    </bean>

    <bean id="colorWrite" class="java.awt.Color">
        <constructor-arg type="int" index="0">
            <value>255</value>
        </constructor-arg>
        <constructor-arg type="int" index="1">
            <value>255</value>
        </constructor-arg>
        <constructor-arg type="int" index="2">
            <value>255</value>
        </constructor-arg>
    </bean>

    <bean id="colorDimGrey" class="java.awt.Color">
        <constructor-arg type="int" index="0">
            <value>105</value>
        </constructor-arg>
        <constructor-arg type="int" index="1">
            <value>105</value>
        </constructor-arg>
        <constructor-arg type="int" index="2">
            <value>105</value>
        </constructor-arg>
    </bean>
</beans>

 

4. 服务端生成校验码

package personal.hutao.captcha;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.octo.captcha.service.image.ImageCaptchaService;

@Controller
@RequestMapping("/captcha")
public class JcaptchaImageCreater {
	
	private Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	private ImageCaptchaService imageCaptchaService;
	
	@RequestMapping
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
		try {
			ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
			String captchaId = request.getSession().getId();
			BufferedImage challenge = imageCaptchaService.getImageChallengeForID(captchaId, request.getLocale());

			response.setHeader("Cache-Control", "no-store");
			response.setHeader("Pragma", "no-cache");
			response.setDateHeader("Expires", 0L);
			response.setContentType("image/jpeg");
			
			ImageIO.write(challenge, "jpeg", jpegOutputStream);
			byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

			ServletOutputStream respOs = response.getOutputStream();
			respOs.write(captchaChallengeAsJpeg);
			respOs.flush();
			respOs.close();
		} catch (IOException e) {
			logger.error("generate captcha image error: {}", e.getMessage());
		}
	}

}

 

5. 页面调用

<input type="text" id="captcha" name="captcha" maxlength="4" />
<img src="captcha" onclick="this.src='captcha?d='+new Date().getTime()"/>

如图:

 

6. 提交登录表单后,校验

package personal.hutao.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
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 com.octo.captcha.service.image.ImageCaptchaService;

@RequestMapping("/login")
@Controller
public class LoginController {
	
	@Autowired
	private ImageCaptchaService imageCaptchaService;
	
	@RequestMapping(value = "/doLogin", method = RequestMethod.POST)
	@ResponseBody
	public Boolean login(String username, String password, String captcha, HttpServletRequest request) {
		Boolean result = Boolean.FALSE;
		
		Boolean isResponseCorrect = imageCaptchaService.validateResponseForID(request.getSession().getId(), captcha);
		if (isResponseCorrect) {
			// 继续校验用户名密码等..
		}
		
		return result;
	}

}

 

 OK,至此就在Spring/SpringMVC环境下实现了Jcaptcha,赶快试试吧~

 

  • 大小: 3.3 KB
0
1
分享到:
评论
1 楼 yinjingjing0827 2016-12-06  
你好,请问我生成的验证码不是4位,但是设置的是4位,这是什么情况啊?

相关推荐

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    在企业级开发中,SpringMVC 是一个广泛使用的框架,用于构建高效、模块化和可测试的 Web 应用程序。本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能...

    druid实现springmvc数据库连接的用户名和密码加密

    在Spring MVC中,可以创建一个自定义的Bean,该Bean使用Java的`java.security.MessageDigest`类或其他加密库来实现加密功能。 2. **扩展Druid配置**:默认的Druid配置并不直接支持加密的用户名和密码。因此,我们...

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    在这个例子中,`@Validated`触发了对`User`对象的数据验证,而`BindingResult`参数则用于接收验证结果。如果验证失败,我们可以直接处理错误,无需手动检查每个字段。 除此之外,Spring MVC还支持自定义拦截器(`...

    springmvc数据验证

    在验证失败的情况下,我们可以检查模型中的错误信息是否正确设置,或者响应状态码和错误消息是否符合预期。 总的来说,Spring MVC的数据验证机制是其强大功能的一个体现,它简化了验证流程,提高了开发效率,增强了...

    SpringMVC注册功能的实现.docx

    在 SpringMVC 框架中,我们可以使用 `@NotEmpty` 注解来验证用户输入的数据。 4.2 账号唯一 在注册过程中,我们需要对用户输入的账号进行唯一性验证,以确保账号不重复。在 SpringMVC 框架中,我们可以使用 `@...

    springmvc 使用hibernate-validator校验包

    在Spring MVC项目中使用Hibernate Validator,首先需要在项目的pom.xml或build.gradle文件中添加对应的依赖。例如,如果是Maven项目,可以在pom.xml中加入以下依赖: ```xml &lt;groupId&gt;org.hibernate ...

    springmvc数据验证jar包

    这个"springmvc数据验证jar包"正是为了实现这一功能而必备的组件。它包含了多个关键库,如Hibernate Validator、JBoss Logging和Validation API,这些库协同工作以确保输入数据的有效性,从而增强应用程序的安全性和...

    SpringMVC入门很简单之数据验证

    在这个"SpringMVC入门很简单之数据验证"的主题中,我们将深入探讨如何在SpringMVC中实现数据验证。 在Web应用中,数据验证是必不可少的一环,它确保了用户提交的数据符合预设的规则和格式,防止非法或无效的数据...

    SpringMVC 拦截器 实现 登录退出功能

    在本例中,我们将讨论如何使用拦截器来实现用户登录验证以及安全退出功能。 首先,我们需要了解SpringMVC中的拦截器是如何工作的。SpringMVC的拦截器是基于Servlet的Filter机制扩展而来的,它通过`...

    非常详细的用 java(springmvc+mybatis)实现excel导入功能并且保存到数据库

    在本实例中,使用了SpringMVC框架来实现Web应用程序。SpringMVC是一种基于Java的Web应用程序框架,提供了一个灵活的方式来构建Web应用程序。它提供了一个Model-View-Controller(MVC)架构,允许开发者将应用程序...

    springMVC配置连接数据库实现登录功能的一个小demo

    在这个"springMVC配置连接数据库实现登录功能的小demo"中,我们将探讨如何使用Spring MVC与Hibernate集成来处理用户登录功能。Hibernate是一个流行的ORM(对象关系映射)框架,它简化了与数据库的交互。 首先,我们...

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码.zip

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...

    SpringMVC入门很简单之实现注解式权限验证

    在本文中,我们将深入探讨如何在SpringMVC框架中实现注解式的权限验证。SpringMVC是Java领域中广泛使用的Web开发框架,它为开发者提供了强大的功能,包括模型-视图-控制器(MVC)架构、依赖注入以及丰富的注解支持。...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_6_数据校验 共26页.pptx

    在SpringMVC 3.0之前,数据校验主要依赖于自定义的验证类。这些验证类通常与实体类相关联,并实现`Validator`接口。 **自定义验证类步骤:** 1. **创建验证类:** 验证类应当位于与实体类相同的包下,并实现`org....

    SpringMVC完整使用教程

    你可以直接在方法签名中使用参数,如 `String name` 来获取请求参数;或者使用 `@RequestParam` 注解指定参数名。对于复杂的数据结构,可以使用 POJO 类绑定请求参数值,SpringMVC 会自动将请求参数填充到对象中。...

    spring+springmvc+mybatis项目案例实现用户角色权限管理

    使用spring+springmvc框架 整合了Mybatis持久层框架 整合Druid用于数据库连接,并使用Druid对业务层监控spring jdbc 整合EhCache,对Mybatis的二级缓存进行管理和对spring进行缓存管理 整合FastJson对指定http类型的...

    通过spring整合jcaptcha来处理验证码

    通过以上步骤,我们就可以在Spring应用中成功地整合并使用jCaptcha生成和验证验证码,提高系统的安全性。在实际项目中,可以根据具体需求进一步优化和扩展此功能,例如实现动态加载验证码、多语言支持等。

    SpringMVC使用JSR-303进行验证Bean.docx

    本篇文章将详细介绍如何在SpringMVC中使用JSR-303进行Bean验证。 首先,我们需要引入JSR-303的实现库。通常使用的是Hibernate Validator,它是JSR-303规范的一个成熟实现。在不使用Maven的情况下,我们需要下载`...

    SpringMVC是实现登陆

    本篇文章将深入探讨如何使用SpringMVC来实现一个简单的登录功能,以及在此过程中涉及的关键知识点。 首先,我们要了解SpringMVC的基本架构。它遵循Model-View-Controller(MVC)设计模式,将业务逻辑、数据展示和...

Global site tag (gtag.js) - Google Analytics