`

在Spring中使用jcaptcha实现图片验证

阅读更多
转载来自http://sha0k.iteye.com/blog/1364950

在Spring中使用jcaptcha首先要添加jcaptcha的包 我使用的是jcaptcha-1.0-all.jar 官网http://jcaptcha.sourceforge.net/jcaptcha/index.html
还要添加commons-collections-*.*.jar 版本自己控制
首先是ApplicationContext.xml的配置,这里主要是对验证码生成器服务的注入,控制类就是Spring Web中的Controller,没有什么特别的
Xml代码 
<bean id="imageCaptchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">   
        <constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0">   
            <ref bean="fastHashMapCaptchaStore"/>   
        </constructor-arg>      
        <!--which captcha Engine you use-->      
        <constructor-arg type="com.octo.captcha.engine.CaptchaEngine" index="1">   
            <ref bean="captchaEngineEx"/>   
        </constructor-arg>      
        <constructor-arg index="2">      
            <value>180</value>      
        </constructor-arg>      
        <constructor-arg index="3">      
            <value>100000</value>      
        </constructor-arg>      
        <constructor-arg index="4">      
            <value>75000</value>      
        </constructor-arg>     
    </bean>   
    <bean id="fastHashMapCaptchaStore"  
        class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore"/>      
    <!--you can define more than one captcha engine here -->      
    <bean id="captchaEngineEx"  
        class="com.sha0k.util.CaptchaEngineEx"/> 
下面是验证码生成器CaptchaEngineEx,自己编写:
Java代码 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.image.ImageFilter; 
 
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator; 
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator; 
import com.octo.captcha.component.image.color.RandomListColorGenerator; 
import com.octo.captcha.component.image.deformation.ImageDeformation; 
import com.octo.captcha.component.image.deformation.ImageDeformationByFilters; 
import com.octo.captcha.component.image.fontgenerator.FontGenerator; 
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator; 
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster; 
import com.octo.captcha.component.image.textpaster.TextPaster; 
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator; 
import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage; 
import com.octo.captcha.component.image.wordtoimage.WordToImage; 
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator; 
import com.octo.captcha.component.word.wordgenerator.WordGenerator; 
import com.octo.captcha.engine.image.ListImageCaptchaEngine; 
import com.octo.captcha.image.gimpy.GimpyFactory; 
 
public class CaptchaEngineEx extends ListImageCaptchaEngine { 
 
    protected void buildInitialFactories() { 
        int minWordLength = 4; 
        int maxWordLength = 5; 
        int fontSize = 50; 
        int imageWidth = 250; 
        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)); 
 
    } 
 

验证码图片的显示是一个向服务器请求的过程 所以必须有serlvet来处理这个请求,下面是显示验证码的控制器类
Java代码 
import java.awt.image.BufferedImage; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
 
import javax.annotation.Resource; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
 
import com.octo.captcha.service.CaptchaServiceException; 
import com.octo.captcha.service.image.ImageCaptchaService; 
import com.sun.image.codec.jpeg.ImageFormatException; 
import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 
 
@Controller 
public class GenerateImageController{ 
 
    @Resource(name = "imageCaptchaService") 
    private ImageCaptchaService imageCaptchaService; 
 
    @RequestMapping(value = "/generatImage") 
    public void ImageCaptcha(HttpServletRequest request , HttpServletResponse response , Model model)  
     throws ServletException, IOException{ 
 
        byte[] captchaChallengeAsJpeg = null; 
        // the output stream to render the captcha image as jpeg into 
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); 
        try { 
            // get the session id that will identify the generated captcha. 
            // the same id must be used to validate the response, the session id 
            // is a good candidate! 
            String captchaId = request.getSession().getId(); 
            // call the ImageCaptchaService getChallenge method 
            BufferedImage challenge = imageCaptchaService 
                    .getImageChallengeForID(captchaId, request 
                            .getLocale()); 
 
            // a jpeg encoder 
            JPEGImageEncoder jpegEncoder = JPEGCodec 
                    .createJPEGEncoder(jpegOutputStream); 
            jpegEncoder.encode(challenge); 
        } catch (IllegalArgumentException e) { 
        } catch (CaptchaServiceException e) { 
        } catch (ImageFormatException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
         
        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();   
        // flush it in the response   
        response.setHeader("Cache-Control", "no-store");   
        response.setHeader("Pragma", "no-cache");   
        response.setDateHeader("Expires", 0);   
        response.setContentType("image/jpeg");   
        ServletOutputStream responseOutputStream = response   
                .getOutputStream();   
        responseOutputStream.write(captchaChallengeAsJpeg);   
        responseOutputStream.flush();   
        responseOutputStream.close(); 
    } 
 

  而页面的图片显示只要这么简简单单的一句就够了 getimg.jsp页面
Html代码 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
     
    <title>My JSP 'getimg.jsp' starting page</title> 
     
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    --> 
 
  </head> 
   
  <body> 
    <img alt="" src="generatImage"> 
  </body> 
</html> 

验证用户输入的验证码的控制类
Java代码 
import java.io.IOException; 
 
import javax.annotation.Resource; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
 
import com.octo.captcha.service.CaptchaServiceException; 
import com.octo.captcha.service.image.ImageCaptchaService; 
 
@Controller 
public class ImageValidationController { 
 
    @Resource(name = "imageCaptchaService") 
    ImageCaptchaService imageCaptchaService; 
     
    @RequestMapping(value = "/validateImage") 
    public void ValidateCaptchaImage(HttpServletRequest request,      
            HttpServletResponse response)throws ServletException , IOException { 
        Boolean isResponseCorrect = Boolean.FALSE;      
        //remenber that we need an id to validate!      
        String captchaId = request.getSession().getId();      
        //retrieve the response      
        String captcha_value = request.getParameter("captcha_value");      
        // Call the Service method      
        try {      
            isResponseCorrect = imageCaptchaService.validateResponseForID(captchaId, captcha_value);   
        } catch (CaptchaServiceException e) {      
            //should not happen, may be thrown if the id is not valid       
        }      
        System.out.println(isResponseCorrect);    
       // httpServletResponse.encodeUrl("sucess.html");   
        if(isResponseCorrect.booleanValue()){   
            response.sendRedirect("success.html");   
        }   
        else {   
            response.sendRedirect("failture.html");   
        }   
    }      

验证页面:

Html代码 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
    <script type="text/javascript" 
            src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
        <script type="text/javascript" 
            src="http://jquery-json.googlecode.com/files/jquery.json-2.2.min.js"></script> 
        <script type="text/javascript"> 
             
                function ajaxRefresh(){   
       
                document.getElementById("image").contentWindow.location.reload();    
                }   
         
         
        </script> 
     
    <title>My JSP 'image.jsp' starting page</title> 
     
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    --> 
 
  </head> 
   
  <body> 
    <iframe src="getimg.jsp" id="image"></iframe> 
    <a href="javascript:void(0)" onclick="ajaxRefresh()">ajaxRefresh</a> 
    <form action="validateImage"> 
        <input type='text' name='captcha_value'> 
        <input type="submit" value="提交"> 
    </form>  
  </body> 
</html> 
分享到:
评论

相关推荐

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

    综上,虽然Jcaptcha在Spring MVC中实现验证码验证提供了便利,但在实际部署时,需要考虑其局限性并采取相应的解决策略,以确保系统的稳定性和用户体验。开发者也可以考虑使用其他验证码库,如Google的reCAPTCHA,它...

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

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

    jcaptcha学习spring整合

    2. **配置Bean**:在Spring的配置文件中声明Jcaptcha的Bean,包括ImageCaptchaService,这通常涉及到验证码的生成与存储策略。 3. **拦截器集成**:创建一个Spring MVC拦截器,用于在请求处理前生成验证码,并将其...

    验证码 验证码例子 jcaptcha jcaptcha例子

    5. 与Web框架的集成:jCaptcha可以很容易地与各种Web应用框架(如Spring、Struts等)结合,提供便捷的API和标签库,便于在Servlet中实现验证码的生成和验证。 在实际应用中,使用jCaptcha的步骤大致如下: 1. 引入...

    JCaptcha

    3. **Java实现**:JCaptcha是用Java语言开发的,因此它与Java应用程序和Web应用框架(如Spring、Struts等)有很好的兼容性,可以方便地集成到Java项目中。 4. **图像生成**:JCaptcha的核心功能是生成复杂的图像...

    验证码 spring jcaptcha

    总之,Spring与Jcaptcha的结合使得在Java Web应用中实现验证码功能变得简单且灵活。通过理解它们的集成方式和工作原理,你可以根据项目需求定制合适的验证码策略,有效防止自动化攻击,保护你的网站安全。

    jcaptcha的验证码例子

    要在基于`Acegi`的安全框架中使用`jCaptcha`,首先需要将`jcaptcha-1.0-all.jar`添加到项目类路径中,然后配置`Acegi`的安全设置以启用验证码验证。这通常涉及到以下几个步骤: 1. **配置`jCaptcha`服务**:创建一...

    基于SSM实现的注册登录系统。验证码使用jcaptcha,发送邮件使用JEmail.zip

    在这个"基于SSM实现的注册登录系统"项目中,验证码使用了jcaptcha库,邮件发送则借助了JEmail,这些技术的应用使得系统的安全性和用户体验得到了提升。 **1. SSM框架** - **Spring**:作为基础容器,管理着应用的...

    JCaptcha验证码生成

    在Spring MVC等框架中,可以通过配置拦截器或控制器来实现验证码的生成和验证。 7. **JCaptcha的优缺点** 优点:JCaptcha提供了丰富的自定义选项,易于集成,支持多种验证策略,且性能良好。缺点:对于高级的图像...

    基于SSM实现的注册登录系统 验证码使用jcaptcha,发送邮件使用JEmail.zip

    - **AOP(面向切面编程)**:在注册登录过程中,可能会用到日志记录、权限控制等功能,这些都可以通过Spring的AOP来实现,使代码更加模块化。 2. **SpringMVC框架**: - **模型-视图-控制器**:SpringMVC是Spring...

    spring security3.1 实现验证码自定义登录

    最后,为了方便开发,我们可以使用一些开源的验证码生成工具库,如JCaptcha或Simple Captcha,它们可以简化验证码生成和验证的实现。 总结来说,Spring Security 3.1的验证码自定义登录涉及验证码生成、自定义...

    jcaptcha验证码

    在实际应用中,JCAPTCHA可以轻松集成到各种Java Web框架中,如Spring、Struts等。对于导入后的使用,开发者需要按照JCAPTCHA的文档进行配置,这可能涉及到Maven或Gradle的依赖管理,以及在Web应用的配置文件中设定...

    jcaptcha-sample_验证码生成

    4. **Web 应用集成**:在 Spring MVC 或其他 Web 框架中,你可以将 `jCaptcha` 集成到控制器中,处理验证码的生成和验证。这通常涉及到在请求处理方法中生成验证码,在表单提交时验证验证码。 5. **安全存储与清理*...

    java通过JCaptcha生成验证码

    8. **Web 应用集成**:在 Spring 或其他 Web 框架中,可以将验证码服务注册为 Spring Bean,然后在控制器中注入并使用。在 JSP 或者其他视图技术中,可以将验证码图像作为响应的一部分发送给客户端。 9. **无障碍性...

    security+jcaptcha(验证码)框架搭建

    在 `web.xml` 中配置 Spring Security 上下文和 JCaptcha 过滤器。 ```xml &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_3_0.dtd"&gt; ...

    security+jcaptcha(验证码)+mybatis框架搭建

    - 在项目的`web.xml`或`spring-security.xml`配置文件中配置Jcaptcha的相关参数。 ##### 3. MyBatis MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和...

    JCaptcha 开源的验证码组件

    4. **易于集成**:JCaptcha支持多种Web框架,如Servlet、Spring MVC等,方便开发者快速集成到自己的项目中。 ### 二、JCaptcha工作原理 1. **生成验证码**:当用户请求验证码时,JCaptcha会随机生成一个字符串,...

    jcaptcha写验证码要用到的jar包

    在Java开发中,Jcaptcha(Just Another CAPTCHA)是一个强大的开源验证码库,它提供了一种简单易用的方式来生成和验证这些复杂的图像验证码。 Jcaptcha的核心功能包括生成随机且难以自动识别的图形验证码,以及验证...

    java验证码组件Jcaptcha

    Java验证码组件Jcaptcha是用于生成安全、动态的图像验证码的工具,主要目的是为了防止自动化的机器人或恶意软件在Web应用程序中进行非法操作,如批量注册、登录等。它通过生成随机字符组合并扭曲图像背景来增加人眼...

    jcaptcha 彩色验证码-下载即可使用

    在这个名为“jcaptcha 彩色验证码-下载即可使用”的项目中,我们聚焦于一个特定的验证码实现:jCaptcha。jCaptcha 是一个基于 Java 的开源验证码库,它提供了丰富的图形验证码解决方案。这个库的特点在于可以创建...

Global site tag (gtag.js) - Google Analytics