kaptcha 實現驗證碼

依賴

<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

方法一:配置kaptcha與servlet映射(web.xml)

KaptchaServlet會把驗證碼設置到session中

<servlet>
        <!-- 生成圖片的Servlet -->
        <servlet-name>Kaptcha</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

        <!-- 是否有邊框 -->
        <init-param>
            <param-name>kaptcha.border</param-name>
            <param-value>no</param-value>
        </init-param>
        <!-- 字體顏色 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.color</param-name>
            <param-value>red</param-value>
        </init-param>
        <!-- 圖片寬度 -->
        <init-param>
            <param-name>kaptcha.image.width</param-name>
            <param-value>135</param-value>
        </init-param>
        <!-- 圖片高度 -->
        <init-param>
            <param-name>kaptcha.image.height</param-name>
            <param-value>50</param-value>
        </init-param>
        <!-- 使用哪些字符生成驗證碼 -->
        <init-param>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>ACDEFHKPRSTWX345679</param-value>
        </init-param>
        <!-- 字體大小 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.size</param-name>
            <param-value>43</param-value>
        </init-param>
        <!-- 干擾線的顏色 -->
        <init-param>
            <param-name>kaptcha.noise.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <!-- 字符個數 -->
        <init-param>
            <param-name>kaptcha.textproducer.char.length</param-name>
            <param-value>4</param-value>
        </init-param>
        <!-- 使用哪些字體 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.names</param-name>
            <param-value>Arial</param-value>
        </init-param>
    </servlet>

    <!-- 映射的url -->
    <servlet-mapping>
        <servlet-name>Kaptcha</servlet-name>
        <url-pattern>/Kaptcha</url-pattern>
    </servlet-mapping>

方法二:ApplicationContext.xml配置

xml配置:
<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
    <property name="config">  
        <bean class="com.google.code.kaptcha.util.Config">  
            <constructor-arg>  
                <props>  
                    <prop key="kaptcha.border">no</prop>  
                    <prop key="kaptcha.border.color">105,179,90</prop>  
                    <prop key="kaptcha.image.width">160</prop>  
                    <prop key="kaptcha.image.height">50</prop>  
                    <prop key="kaptcha.session.key">code</prop>  
                    <prop key="kaptcha.textproducer.font.color">red</prop>  
                    <prop key="kaptcha.textproducer.font.size">35</prop>  
                    <prop key="kaptcha.textproducer.char.space">3</prop>  
                    <prop key="kaptcha.textproducer.char.length">5</prop>  
                    <!-- 配置中文 <prop key="kaptcha.textproducer.impl">com.google.code.kaptcha.text.impl.ChineseTextProducer</prop> -->  
                    <prop key="kaptcha.textproducer.font.names">彩雲,宋體,楷體,微軟雅黑</prop>  
                </props>  
            </constructor-arg>  
        </bean>  
    </property>  
</bean>

新建一個controller用於生成驗證碼:
@Controller  
public class CaptchaRandomCodeController { 

    @Autowired   
    private Producer captchaProducer;  

    @RequestMapping("/Kaptcha")  
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        response.setDateHeader("Expires", 0);    // 禁止服務器端緩存  
        // 設置標準的 HTTP/1.1 no-cache headers.  
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");  
        // 設置IE擴展 HTTP/1.1 no-cache headers (use addHeader).  
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");  
        response.setHeader("Pragma", "no-cache");    // 設置標準 HTTP/1.0 不緩存圖片  
        response.setContentType("image/jpeg");    // 返回一個 jpeg 圖片,默認是text/html(輸出文檔的MIMI類型)  
        String capText = captchaProducer.createText();    // 爲圖片建立文本  
          
        // 將文本保存在session中,這裏就使用包中的靜態變量吧  
        request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);  
          
        BufferedImage bi = captchaProducer.createImage(capText);     // 建立帶有文本的圖片  
        ServletOutputStream out = response.getOutputStream();  
        // 圖片數據輸出  
        ImageIO.write(bi, "jpg", out);  
        try {  
            out.flush();  
        } finally {  
            out.close();  
        }  
    }  
}

校驗驗證碼的工具類

public class CodeUtil {

    public static boolean chekVerifyCode(HttpServletRequest request) {

        //圖片裏的驗證碼,從seesion中獲取。
        String verifyCodeExepected = (String)request.getSession().getAttribute(
                com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);

        //verifyCodeActual這個爲輸入的驗證碼。將request中對應的key轉換爲string類型的
        String verifyCodeActual = request.getParameter(verifyCodeActual);

        //若是輸入驗證碼與實際驗證碼不相等或空返回false,若是輸入驗證碼不爲空切與實際驗證碼相等,返回true。
        if(verifyCodeActual == null || !verifyCodeActual.equals(verifyCodeExepected)) {
            return false;
        }
        return true;
    }
}

相關文章
相關標籤/搜索