spring boot (三): 配置kaptcha開(kāi)發(fā)圖片驗(yàn)證碼

工具及其技術(shù):

  • vscode(對(duì),不用idea 也能開(kāi)發(fā)得特別爽)
  • spring boot 2.0
  • kapcha

1.添加依賴(lài):

在pom.xml中輸入依賴(lài):

<!-- kaptcha驗(yàn)證碼 -->
        <dependency>
        <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>

2. 通過(guò)配置類(lèi)來(lái) 配置kaptcha

首先,新建kaptcha的config類(lèi):

import java.util.Properties;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class KaptchaConfig {

    @Bean
    public DefaultKaptcha getDefaultKaptcha(){
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        
        properties.setProperty("kaptcha.border", "yes");
        properties.setProperty("kaptcha.border.color", "105,179,90");
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        properties.setProperty("kaptcha.textproducer.char.space", "5");
        properties.setProperty("kaptcha.textproducer.font.size", "30");
        properties.setProperty("kaptcha.session.key", "code");
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        properties.setProperty("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }

}

注意:

  • 要用@Configuration注解來(lái)注冊(cè)這個(gè)配置文件
  • defaultKaptcha 這個(gè)kaptcha類(lèi)的實(shí)例在spring 周期中為單例模式,注意命名(需要在conrtoller中用同名變量去獲得該bean的實(shí)例)

然后新建kaptchacontroller,用來(lái)得到驗(yàn)證碼圖片:

//KaptchaController.java
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
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;

@Controller
public class KaptchaContorller {

   @Autowired
   private Producer defaultKaptcha = null;

   @RequestMapping("/kaptcha")
   public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) {
       HttpSession session = request.getSession();
       response.setDateHeader("Expires", 0);

       // 告訴瀏覽器不要緩存,防止生成同樣的驗(yàn)證碼圖片
       response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
       response.addHeader("Cache-Control", "post-check=0, pre-check=0");
       response.setHeader("Pragma", "no-cache");

       // 返回信息為jpg
       response.setContentType("image/jpeg");

       // 生成驗(yàn)證碼
       String capText = defaultKaptcha.createText();

       // 將驗(yàn)證碼生成的文字保存到session 中,等待比對(duì)
       session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
       BufferedImage bufferedImage = defaultKaptcha.createImage(capText);
       // 將圖片寫(xiě)到response中返回s
       try {

           ServletOutputStream outputStream = response.getOutputStream();
           ImageIO.write(bufferedImage, "jpg", outputStream);
           outputStream.flush();
           outputStream.close();
       } catch (Exception e) {

           e.printStackTrace();
       }
   }

}

注意事項(xiàng):

@Autowired
    private Producer defaultKaptcha = null;
  • Producer的變量名必須是kaptchaconfig.java中defaultKaptcha的實(shí)例名字;
  • 每次在生成驗(yàn)證碼的時(shí)候,將驗(yàn)證碼的內(nèi)容寫(xiě)入到session中,然后下次判斷輸入驗(yàn)證碼是否正確的時(shí)候可以用session指定key來(lái)獲取判斷

生成驗(yàn)證碼圖片效果:


image

3. 驗(yàn)證碼校驗(yàn)

在controller 中,我們只需要拿出session中的驗(yàn)證碼值,跟post上來(lái)的結(jié)果做一遍比較,即可:

  @RequestMapping(value = "/login")
    public String login(HttpServletRequest request){
        //獲取生成的驗(yàn)證碼
        String verifyCodeExpected = (String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
        String inputCode = request.getParameter("kaptchaString");
        if(inputCode==null){
            return "error";
        }
        if(inputCode.equals(verifyCodeExpected)){
            return "OK";
        }else{
            return "Error";
        }
    }

    @RequestMapping("/")
    public String index(){
        return "forward:/index.html";
    }
//index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測(cè)試kaptcha</title>
    <script type="text/javascript">
        function refresh() {
            document.getElementById('kaptchaimg').src="/kaptcha";
        }
    </script>
</head>
<body>
<form action="/login" method="POST">
    驗(yàn)證碼:  <input type="text" placeholder="請(qǐng)輸入驗(yàn)證碼" name="kaptchaString">
    <div class="item-input">
        <img id="kaptchaimg" 
             onclick="refresh()" src="/kaptcha" />
    </div>
    <input type="submit" value="submit" />
</form>

</body>
</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纷捞,一起剝皮案震驚了整個(gè)濱河市凰盔,隨后出現(xiàn)的幾起案子昧港,更是在濱河造成了極大的恐慌,老刑警劉巖摊滔,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爽柒,居然都是意外死亡布讹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)刻伊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)露戒,“玉大人,你說(shuō)我怎么就攤上這事捶箱∶捣妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵讼呢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谦炬,道長(zhǎng)悦屏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任键思,我火速辦了婚禮础爬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吼鳞。我一直安慰自己看蚜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布赔桌。 她就那樣靜靜地躺著供炎,像睡著了一般渴逻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上音诫,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天惨奕,我揣著相機(jī)與錄音,去河邊找鬼竭钝。 笑死梨撞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的香罐。 我是一名探鬼主播卧波,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庇茫!你這毒婦竟也來(lái)了港粱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤港令,失蹤者是張志新(化名)和其女友劉穎啥容,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體顷霹,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咪惠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淋淀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遥昧。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朵纷,靈堂內(nèi)的尸體忽然破棺而出炭臭,到底是詐尸還是另有隱情,我是刑警寧澤袍辞,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布鞋仍,位于F島的核電站,受9級(jí)特大地震影響搅吁,放射性物質(zhì)發(fā)生泄漏威创。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一谎懦、第九天 我趴在偏房一處隱蔽的房頂上張望肚豺。 院中可真熱鬧,春花似錦界拦、人聲如沸吸申。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)截碴。三九已至梳侨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隐岛,已是汗流浹背猫妙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聚凹,地道東北人割坠。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妒牙,于是被迫代替她去往敵國(guó)和親彼哼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容