Kaptcha

學習完整課程請移步 互聯(lián)網 Java 全棧工程師

驗證碼的作用

防止惡意破解密碼层扶、刷票箫章、論壇灌水、刷頁怒医。

有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,實際上使用驗證碼是現在很多網站通行的方式(比如招商銀行的網上個人銀行奢讨,百度社區(qū))稚叹,我們利用比較簡易的方式實現了這個功能。雖然登錄麻煩一點拿诸,但是對網友的密碼安全來說這個功能還是很有必要扒袖,也很重要。但我們還是 提醒大家要保護好自己的密碼 亩码,盡量使用混雜了數字季率、字母、符號在內的 6 位以上密碼描沟,不要使用諸如 1234 之類的簡單密碼或者與用戶名相同飒泻、類似的密碼 鞭光,免得你的賬號被人盜用給自己帶來不必要的麻煩。

驗證碼通常使用一些線條和一些不規(guī)則的字符組成泞遗,主要作用是為了防止一些黑客把密碼數據化盜取惰许。

Kaptcha 簡介

Kaptcha 是一個可高度配置的實用驗證碼生成工具,可自由配置的選項如:

  • 驗證碼的字體
  • 驗證碼字體的大小
  • 驗證碼字體的字體顏色
  • 驗證碼內容的范圍(數字史辙,字母汹买,中文漢字!)
  • 驗證碼圖片的大小聊倔,邊框晦毙,邊框粗細,邊框顏色
  • 驗證碼的干擾線
  • 驗證碼的樣式(魚眼樣式耙蔑、3D见妒、普通模糊、...)

Kaptcha 詳細配置表

Constant 描述 默認值
kaptcha.border 圖片邊框纵潦,合法值:yes , no yes
kaptcha.border.color 邊框顏色徐鹤,合法值: r,g,b (and optional alpha) 或者 white,black,blue. black
kaptcha.image.width 圖片寬 200
kaptcha.image.height 圖片高 50
kaptcha.producer.impl 圖片實現類 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本實現類 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合,驗證碼值從此集合中獲取 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 驗證碼長度 5
kaptcha.textproducer.font.names 字體 Arial, Courier
kaptcha.textproducer.font.size 字體大小 40px.
kaptcha.textproducer.font.color 字體顏色邀层,合法值: r,g,b 或者 white,black,blue. black
kaptcha.textproducer.char.space 文字間隔 2
kaptcha.noise.impl 干擾實現類 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 干擾 顏色返敬,合法值: r,g,b 或者 white,black,blue. black
kaptcha.obscurificator.impl 圖片樣式:<br />水紋 com.google.code.kaptcha.impl.WaterRipple <br /> 魚眼 com.google.code.kaptcha.impl.FishEyeGimpy <br /> 陰影 com.google.code.kaptcha.impl.ShadowGimpy com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl 背景實現類 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景顏色漸變,開始顏色 light grey
kaptcha.background.clear.to 背景顏色漸變寥院, 結束顏色 white
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key session key KAPTCHA_SESSION_KEY
kaptcha.session.date session date KAPTCHA_SESSION_DATE

Spring MVC 整合 Kaptcha

POM

pom.xml 配置文件如下:

<dependency>
    <groupId>com.google.code.kaptcha</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3</version>
</dependency>

主要增加了 com.google.code.kaptcha:kaptcha 依賴

創(chuàng)建 Spring 配置

創(chuàng)建一個名為 spring-context-kaptcha.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="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">yes</prop>
                        <prop key="kaptcha.border.color">105,179,90</prop>
                        <prop key="kaptcha.textproducer.font.color">blue</prop>
                        <prop key="kaptcha.image.width">125</prop>
                        <prop key="kaptcha.image.height">45</prop>
                        <prop key="kaptcha.textproducer.font.size">45</prop>
                        <prop key="kaptcha.session.key">code</prop>
                        <prop key="kaptcha.textproducer.char.length">4</prop>
                        <prop key="kaptcha.textproducer.font.names">宋體,楷體,微軟雅黑</prop>
                    </props>
                </constructor-arg>
            </bean>
        </property>
    </bean>
</beans>

控制器關鍵代碼

Controller 層的關鍵代碼如下,主要作用為將生成的驗證碼放入 Session 并輸出到頁面

package com.funtl.my.shop.web.ui.controller;

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
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.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;

@Controller
public class KaptchaController {

    @Autowired
    private Producer captchaProducer;

    @RequestMapping(value = "verification", method = RequestMethod.GET)
    public ModelAndView verification(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setDateHeader("Expires", 0);
        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");
        // return a jpeg
        response.setContentType("image/jpeg");
        // create the text for the image
        String capText = captchaProducer.createText();
        // store the text in the session
        request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
        // create the image with the text
        BufferedImage bi = captchaProducer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();
        // write the data out
        ImageIO.write(bi, "jpg", out);
        try {
            out.flush();
        } finally {
            out.close();
        }
        return null;
    }
}

JSP 關鍵代碼

JSP 使用 <img /> 標簽去請求驗證碼圖片

<img id="verification" src="/verification" style="cursor: pointer;" title="看不清秸谢?換一張" />

為圖片綁定一個點擊事件用于無刷新更換驗證碼

$(function () {
    // 刷新驗證碼
    $("#verification").bind("click", function () {
        $(this).hide().attr('src', '/verification?random=' + Math.random()).fadeIn();
    });
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末凛澎,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子估蹄,更是在濱河造成了極大的恐慌塑煎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭蚁,死亡現場離奇詭異最铁,居然都是意外死亡,警方通過查閱死者的電腦和手機垮兑,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門冷尉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人系枪,你說我怎么就攤上這事雀哨。” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵雾棺,是天一觀的道長垢村。 經常有香客問我嘉栓,道長麻昼,這世上最難降的妖魔是什么馋辈? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮叉抡,結果婚禮上答毫,老公的妹妹穿的比我還像新娘。我一直安慰自己消返,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妻熊,像睡著了一般洛心。 火紅的嫁衣襯著肌膚如雪固耘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死挥等,一個胖子當著我的面吹牛肝劲,可吹牛的內容都是我干的粘室。 我是一名探鬼主播育特,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼犬缨,長吁一口氣:“原來是場噩夢啊……” “哼迷郑!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鹃骂,失蹤者是張志新(化名)和其女友劉穎台盯,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體畏线,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡静盅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了寝殴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒿叠。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚣常,靈堂內的尸體忽然破棺而出栈虚,到底是詐尸還是另有隱情,我是刑警寧澤史隆,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布魂务,位于F島的核電站,受9級特大地震影響泌射,放射性物質發(fā)生泄漏粘姜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一熔酷、第九天 我趴在偏房一處隱蔽的房頂上張望孤紧。 院中可真熱鬧,春花似錦拒秘、人聲如沸号显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽押蚤。三九已至,卻和暖如春羹应,著一層夾襖步出監(jiān)牢的瞬間揽碘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工园匹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雳刺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓裸违,卻偏偏與公主長得像掖桦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子供汛,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容