`
kenee1314
  • 浏览: 10159 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用jcaptcha在Struts中生成验证码

阅读更多
jcaptcha, 是一个Java开源项目, 为Java Completely Automated Public Test to tell Computers and Humans Apart 的简写, 字面意思就是Java实现的可以区分计算机和人的测试.
具体的测试方法有很多种, 比如:
验证码 - (这里讨论的)
音频 - (比如朗读几个字母, 用户输入这些字母来验证)

JCAPTCHA在Struts中配置很简单, 主要是以下三个部分:

1. 需要一个Action或者Servlet来作为页面的接口. 在访问该Acton或Servlet的时候, 调用(2) 生成随机的验证对象, 和当前的Session关联起来;
2. 一个JCAPTCHA Service类. 这个类完成读取配置(如何生成验证码, 生成的内容是什么, 等等), 并实际生成验证码. 同时也对外提供验证用户输入的功能.
3. 其它部分. 比如在UI层需要调用(1)来显示验证码图片, 在验证部分要调用(2)来测试输入的验证码是否正确.

下面是代码.

struts-config.xml:

<action path="/jcaptcha" type="test.CaptchaAction" />

与之对应的JSP部分. 很简单, 一个验证码图片, 一个输入框, 一个提交按钮.

<body>
       <img src="<%= request.getContextPath() %>/jcaptcha.do"/>
      <form method="POST" action="<%= request.getContextPath() %>/test.do?state=verify">
           <input name="code"/>
            <input type="submit"/>
      </form>
</body>

加入一个Action, 作用就是生成图片(写成一个Servlet也能完成一样的功能). Java代码为:

public class CaptchaAction extends Action {


    public ActionForward execute(ActionMapping mapping, ActionForm form,

           HttpServletRequest request, HttpServletResponse response)

           throws Exception {

        try {  

            CaptchaService.getInstance().writeCaptcha(request, response);  

        } catch (Exception e) {  

        e.printStackTrace();

        return mapping.findForward("fatal");  

        }  

       return super.execute(mapping, form, request, response);

    }

}


下面的就是重要的单例类CaptchaService了. 这个类继承自ListImageCaptchaEngine, 是JCAPTCAH的针对图片验证的类. CaptchaService类中有三个方法比较重要:

1. private buildInitialFactories()

这个方法是ListImageCaptchaEngine的abstract方法的覆盖. 必须实现. 目的是初始化验证码生成器的参数.


    protected void buildInitialFactories() {  

        try {  

            SimpleTextPaster parser = (new SimpleTextPaster(MIN_LENGTH, MAX_LENGTH, Color.black));  

        //RandomTextPaster parser = new RandomTextPaster(MIN_LENGTH, MAX_LENGTH, Color.black);  

           

            //UniColorBackgroundGenerator back = new UniColorBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT);

            GradientBackgroundGenerator back = (new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.orange, Color.white));  


            Font f = Font.decode("Consolas");

            RandomFontGenerator rf = (new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, new Font[]{f}));// to easy to read


            WordGenerator words = new RandomWordGenerator("ABCDEFG");

           

            WordToImage word2image = new ComposedWordToImage(rf, back, parser);  

            ImageCaptchaFactory factory = new GimpyFactory(words, word2image);  

            addFactory(factory);              

        } catch (Exception ex) {  

        ex.printStackTrace();

        }  

    }




对上面程序的解释. 一个验证码图片由四部分组成: TestParser, BackgroundGenerator, FontGenerator, 以及WordGenerator


TestParser, 都是从类AbstractTextPaster继承来, 作用是生成验证码中的文字部分. 较常用的下面两种:

- SimpleTextPaster 简单的实现. 文字部分是从左到右顺序排列的. 构造函数的参数分别为最短长度, 最大长度和文字颜色.
- RandomTextPaster 带有随机式样的实现. 和SimpleTextPaster的参数类似. 不过生成的文字部分, 带有随机的样式(粗体,斜体等), 开始位置也是随机的(可能从图片中间开始排列)


BackgroundGenerator, 都是从AbstractBackgroundGenerator类继承而来. 作用是产生验证码图片的背景. 构造的时候传入的基本参数为图片的宽度和高度. 常用的实现为:

- UniColorBackgroundGenerator 单一背景色. 默认的是白色.

- GradientBackgroundGenerator 渐变背景色. 在构造的时候需要指定起始颜色和终止颜色.


FontGenerator, 从AbstractFontGenerator 继承来. 但是和上面两种不同, 基本上在应用中使用的都是RandomFontGenerator. 构造的时候, 传入字体的最小值, 最大值, 以及字体列表的名称. 在生成验证码的时候, 随机选择某种字体, 某种大小来生成. 这里有几个问题需要注意:



FontGenerator字体的大小, TestParser中验证码的个数, 以及BackgroundGenerator中图片的大小需要匹配. 如果设置的不合理, 比如字体过大, 生成若干个验证码后发现图片的大小太小装不下了, 将出现异常.



在选择字体的时候, 下面两种名称开头字体是JCAPTCHA禁止使用的: Courier 和 Times Roman . 因为这两种字体用的太广泛了, 同时也是比较标准的字体, JCAPTCHA认为它们不够安全(容易被识别程序识别出来), 所以将忽略这些字体. 如果没有设置其他的字体的话, 会报错(找不到可用的字体).


WordGenerator: 生成文字的选项. 基本上用的都是RandomWordGenerator随机生成. 构造参数为可选的列表. 生成验证码的时候, 将从这些文字中选择.


这四项确定以后, 就可以生成一个factory, 加入生成列表里面去:


            WordToImage word2image = new ComposedWordToImage(rf, back, parser);  

            ImageCaptchaFactory factory = new GimpyFactory(words, word2image);  

            addFactory(factory);        


同样的, 可以有多个TestParser, BackgroundGenerator, FontGenerator, 生成多个factory, 这样每次生成验证码图片的时候都会更加不同.


2. writeCaptcha方法. 该方法的作用就是实际将图片写入response, 最终显示到浏览器上.

没什么特殊的. 唯一一点是, 通过setAttribute方法在当前的session中保存了验证码.



    public void writeCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {  
        //保存验证码
        imageCaptcha = getNextImageCaptcha();  
        HttpSession session = request.getSession();  
        session.setAttribute(KEY, imageCaptcha);  
        BufferedImage image = (BufferedImage) imageCaptcha.getChallenge();  

        OutputStream outputStream = null;  
        try {  
            outputStream = response.getOutputStream();  
            response.setHeader("Cache-Control", "no-store");  
            response.setHeader("Pragma", "no-cache");  
            response.setDateHeader("Expires", 0);  
            response.setContentType("image/jpeg");  

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);  
            encoder.encode(image);  

            outputStream.flush();  
        } catch (IOException ex) {  
            throw ex;  
        } finally {  
            if (outputStream != null) {  
                try {  
                    outputStream.close();  
                } catch (IOException ex) {  
                }  
            }  
            imageCaptcha.disposeChallenge();  
        }  
    } 


3. 验证方法. 验证用户输入的验证码是否正确.
很简单的一个方法.

    public boolean validateCaptcha(String validateCode, HttpSession session) {  
        try {  
        if (session == null) {
           return false;
        }
            imageCaptcha = (ImageCaptcha) session.getAttribute(KEY);  
            if (imageCaptcha == null) {  
               return false;  
            }  
            validateCode = validateCode.toUpperCase();
            boolean flag = (imageCaptcha.validateResponse(validateCode)).booleanValue();  
            session.removeAttribute(KEY);  
            return flag;  
        } catch (Exception ex) {  
            ex.printStackTrace();  
            return false;  
        }  
    }


剩下的 Action 部分, 加入判断:


public ActionForward verify(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
        String code = request.getParameter("code");
        boolean b = CaptchaService.getInstance().validateCaptcha(code, request.getSession());
        if (b) {

                // 正确

        } else {

               // 错误

        }
}



P.S: 中文的验证码是能够实现的, 只需要把上面的代码中字体一部分改成

            Font f = Font.decode("华文细黑"); //当然其他字体也可以, 但是必须是Server上有的字体

            WordGenerator words = new RandomWordGenerator("一二三四五六");
分享到:
评论

相关推荐

    jcaptcha4struts2-demo-2.0.1.zip_DEMO_JCaptcha4Struts2.jar_jcaptc

    在前端视图层,Jcaptcha4Struts2会提供一个标签来生成验证码图像,并且会有一个隐藏字段用来存储验证码的服务器端值。在用户提交表单时,前端会传递用户输入的验证码,后台通过比较这个值和服务器端保存的值来判断...

    Struts验证码插件 JCaptcha4Struts2

    2. **生成验证码**:在需要验证码的页面,通过插件提供的Action或标签,可以动态生成并显示验证码图像。这些图像通常是随机的、难以识别的字符或数字组合,用户需要手动输入。 3. **验证用户输入**:当用户提交表单...

    基于java的Struts验证码插件 JCaptcha4Struts2.zip

    3. **配置集成**:在Struts2应用中,需要在struts.xml配置文件中添加JCaptcha4Struts2的相关配置,包括拦截器栈、全局结果和Action的配置,以便使验证码功能生效。 4. **视图展示**:在JSP页面上,需要添加相应的...

    JCaptcha4Struts2快速使用指南

    【JCaptcha4Struts2快速使用指南】 JCaptcha4Struts2 是一个专门为Struts2框架集成JCaptcha验证码服务的插件。...通过以上步骤,你就可以在Struts2项目中成功集成并使用JCaptcha4Struts2,提升表单提交的安全性。

    基于Java的Struts验证码插件 JCaptcha4Struts2.zip

    在这个Action中,你需要定义一个方法来生成验证码并存储在session中,另一个方法用于验证用户输入的验证码。 4. 视图渲染:在JSP页面上,使用Struts2标签库来显示验证码图像,并创建一个表单字段供用户输入验证码。...

    基于Java的实例源码-Struts验证码插件 JCaptcha4Struts2.zip

    2. **生成验证码**:在服务器端,插件会创建一个JCaptcha对象,生成一个唯一的验证码字符串并将其保存在session中,同时将对应的图像输出到客户端。 3. **前端展示**:在HTML表单中,需要添加一个图像标签来显示...

    java源码:Struts验证码插件 JCaptcha4Struts2.rar

    5. **示例应用**:如果提供的压缩包包含一个完整的示例应用,那么你可以直接运行这个应用,了解如何在实际项目中使用JCaptcha4Struts2插件。这可能包括Web应用的部署描述符(如`web.xml`),以及必要的Maven或Gradle...

    基于Java的实例开发源码-Struts验证码插件 JCaptcha4Struts2.zip

    6. **JSP标签**:为了方便在JSP页面中使用,插件通常会提供一些自定义标签,如`&lt;jcaptcha:captcha&gt;`,用于插入验证码图片,并处理用户的验证输入。 在实际开发过程中,开发者需要按照以下步骤进行: 1. 添加...

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

    jCaptcha-1.0-all.jar是这个项目的完整打包文件,包含了所有必要的类和库,可以方便地导入到Java项目中使用。 jCaptcha的核心功能包括: 1. 图像生成:jCaptcha可以生成复杂且难以被机器识别的图像,包括扭曲的...

    java验证码组件Jcaptcha

    4. **高性能**:Jcaptcha设计时考虑了性能问题,能够在高并发环境下快速生成验证码,不影响整体应用的响应速度。 5. **互操作性**:由于是基于Java的,Jcaptcha可以与各种后端技术(如Spring、Struts、JSF等)无缝...

    jcaptcha的验证码例子

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

    struts2 验证码----web界面生成几种常见的验证码

    5. **工具使用**:除了Struts2的插件,还有许多第三方库可以帮助我们生成验证码,例如,Google的reCAPTCHA服务,它可以提供更高级的保护,如行为分析,以检测是否为真实人类。这些工具的集成也可以在Struts2项目中...

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

    3. **生成验证码**:在服务器端调用 jCaptcha API 生成验证码图像,并将其发送给客户端。 4. **显示验证码**:在网页上显示生成的验证码图像,通常通过 HTTP 响应的“image/*”类型返回。 5. **验证用户输入**:当...

    jcaptcha验证码

    在Java应用中,开发人员可以使用JCAPTCHA的API来创建一个CAPTCHA服务,这个服务会生成一个唯一的、复杂度高的图像验证码。在用户提交表单时,后端需要接收并验证用户输入的验证码,如果验证通过,则允许执行相应的...

    最新的struts2验证码.rar

    在Struts2中,可以使用Java的Random类或其他库(如Apache Commons Lang的RandomStringUtils)来生成验证码的内容,然后将其存储在Session中以便后续验证。 2. **视图展示**:验证码需要显示在用户界面上,这可以...

    jcaptcha写验证码要用到的jar包

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

    jcaptcha咋包及案例

    3. **生成验证码**:在用户请求时,调用Jcaptcha的API生成验证码,将生成的图像和音频发送给客户端。 4. **存储验证码**:将生成的验证码值存储在一个安全的地方,比如服务器的会话(session)中。 5. **验证输入*...

    一个简单的struts2验证码

    总之,"一个简单的Struts2验证码"涉及到的是在Struts2框架下实现验证码功能的全过程,涵盖了从生成验证码到用户验证的各个步骤。理解并掌握这个过程对于提升web应用的安全性和防止自动化攻击至关重要。

    JCaptcha

    7. **API集成**:JCaptcha提供了一套丰富的API,开发者可以通过这些API轻松地在Web应用中集成验证码功能,包括生成、验证和处理用户输入等操作。 8. **可扩展性**:由于其模块化设计,JCaptcha可以方便地与其他验证...

Global site tag (gtag.js) - Google Analytics