• Spring+JCaptcha验证码使用示例


    1,导入jcaptcha.jar包,这里用的是1.0版本

    2,编写captcha-context.xml配置文件(非必须,可在spring配置文件中直接添加):

    <?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.xsd">
    
        <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"/>
            <constructor-arg type="int" index="3" value="75000"/>
        </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>0123456789</value>
                <!-- <value>abcdefghijklmnopquvwxyz</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>16</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>12</value></constructor-arg>
                    </bean>
                </list>
            </constructor-arg>
        </bean>
        <bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.FunkyBackgroundGenerator">
            <!--背景宽度-->
            <constructor-arg index="0">
                <value>90</value>
            </constructor-arg>
            <!--背景高度-->
            <constructor-arg index="1">
                <value>30</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="colorBlack"/>
            </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="colorBlack" class="java.awt.Color">
            <constructor-arg type="int" index="0">
                <value>50</value>
            </constructor-arg>
            <constructor-arg type="int" index="1">
                <value>50</value>
            </constructor-arg>
            <constructor-arg type="int" index="2">
                <value>50</value>
            </constructor-arg>
        </bean>
    </beans>
    View Code

    3,编写JcaptchaServlet响应请求提供验证码输出:

    protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
    
            byte[] captchaChallengeAsJpeg = null;
            // 输出jpg的字节流
            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 = session.getSessionId(request);
                BufferedImage challenge = captchaService.getImageChallengeForID(
                        captchaId, request.getLocale());
                // a jpeg encoder
                JPEGImageEncoder jpegEncoder = JPEGCodec
                        .createJPEGEncoder(jpegOutputStream);
                jpegEncoder.encode(challenge);
            } catch (IllegalArgumentException e) {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            } catch (CaptchaServiceException e) {
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                return;
            }
    
            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/" + CAPTCHA_IMAGE_FORMAT);
    
            ServletOutputStream responseOutputStream = response.getOutputStream();
            responseOutputStream.write(captchaChallengeAsJpeg);
            responseOutputStream.flush();
            responseOutputStream.close();
        }

    4,在web.xml中添加该servlet:

    <!-- Jcaptcha -->
        <servlet>
            <servlet-name>Jcaptcha</servlet-name>
            <servlet-class>cn.xxx.JcaptchaServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>Jcaptcha</servlet-name>
            <url-pattern>/captcha.jpg</url-pattern>
        </servlet-mapping>

    5,在html中显示验证码只需要以下代码:

    <div><img src="${base }/captcha.jpg" onclick="this.src='${base}/captcha.jpg?'+Math.random()"/></div>
    <div class="input_capt">验证码: <input type="text"id="captcha" name="captcha" />

    6,后台验证的话,只需要调用ImageCaptchaService的一个方法即可:

    imageCaptchaService.validateResponseForID(session.getSessionId(getRequest()), captcha);
  • 相关阅读:
    POJ3690:Constellations(二维哈希)
    Codeforces Round #547 (Div. 3) 题解
    Educational Codeforces Round 48 (Rated for Div. 2) CD题解
    Educational Codeforces Round 50 (Rated for Div. 2) C. Classy Numbers
    Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)
    Codeforces Round #546 (Div. 2) 题解
    Codeforces Round #545 (Div. 2) 题解
    Codeforces Round #544 (Div. 3) 题解
    利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
    xctf一道反序列化题
  • 原文地址:https://www.cnblogs.com/jianzhi/p/3465879.html
Copyright © 2020-2023  润新知