結合開源軟件kaptcha講解登錄驗證碼功能的實現

      網友投稿 835 2022-05-30

      一、驗證碼生成之配置使用kaptcha

      使用google開源的驗證碼實現類庫kaptcha,通過maven坐標引入

      com.github.penggle kaptcha 2.3.2 javax.servlet-api javax.servlet

      假設我們的配置文件是application.yml,新建一個單獨的文件叫做kaptcha.properties。因為kaptcha的配置不符合yaml的規范格式,所以只能采用properties。需配合注解PropertySourc使用。

      假設我們的配置文件是application.properties,將下面這段代碼加入進去即可,不用單獨建立文件。

      下面的驗證碼配置,從英文單詞的角度很容易理解,當我們需要調整驗證碼的邊框、顏色、大小、字體等屬性的時候,可以修改這些配置。

      kaptcha.border=no kaptcha.border.color=105,179,90 kaptcha.image.width=100 kaptcha.image.height=45 kaptcha.session.key=code kaptcha.textproducer.font.color=blue kaptcha.textproducer.font.size=35 kaptcha.textproducer.char.length=4 kaptcha.textproducer.font.names=宋體,楷體,微軟雅黑

      下面的代碼加載了配置文件中的kaptcha配置(參考Spring Boot的配置加載),如果是獨立的properties文件,需加上PropertySource注解說明。另外,我們通過加載完成的配置,初始化captchaProducer的Spring Bean,用于生成驗證碼。

      @Component @PropertySource(value = {"classpath:kaptcha.properties"}) public class CaptchaConfig { @Value("${kaptcha.border}") private String border; @Value("${kaptcha.border.color}") private String borderColor; @Value("${kaptcha.textproducer.font.color}") private String fontColor; @Value("${kaptcha.image.width}") private String imageWidth; @Value("${kaptcha.image.height}") private String imageHeight; @Value("${kaptcha.session.key}") private String sessionKey; @Value("${kaptcha.textproducer.char.length}") private String charLength; @Value("${kaptcha.textproducer.font.names}") private String fontNames; @Value("${kaptcha.textproducer.font.size}") private String fontSize; @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", border); properties.setProperty("kaptcha.border.color", borderColor); properties.setProperty("kaptcha.textproducer.font.color", fontColor); properties.setProperty("kaptcha.image.width", imageWidth); properties.setProperty("kaptcha.image.height", imageHeight); properties.setProperty("kaptcha.session.key", sessionKey); properties.setProperty("kaptcha.textproducer.char.length", charLength); properties.setProperty("kaptcha.textproducer.font.names", fontNames); properties.setProperty("kaptcha.textproducer.font.size",fontSize); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }

      至此,Kaptcha開源驗證碼軟件的配置我們就完成了,如果發現IDEA環境下配置文件讀取中文亂碼,修改如下配置。

      二、驗證碼生成之session保存

      生成驗證碼的Controller。同時需要開放路徑"/kaptcha"的訪問權限,配置成不需登錄也無需任何權限即可訪問的路徑。如何進行配置,筆者之前的文章已經講過了。

      通過captchaProducer.createText()生成驗證碼文字,并和失效時間一起保存到CaptchaImageVO中。

      將CaptchaImageVO驗證碼信息類對象,保存到session中。(這個類的代碼后文有介紹)

      通過captchaProducer.createImage(capText)生成驗證碼圖片,并通過ServletOutputStream返回給前端

      @RestController public class CaptchaController { @Resource DefaultKaptcha captchaProducer; /** * 獲取驗證碼 */ @RequestMapping(value = "/kaptcha", method = RequestMethod.GET) public void kaptcha(HttpSession session, HttpServletResponse response) throws Exception { response.setDateHeader("Expires", 0); 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"); response.setContentType("image/jpeg"); String capText = captchaProducer.createText(); CaptchaImageVO captchaImageVO = new CaptchaImageVO(capText,2 * 60); //將驗證碼存到session session.setAttribute(Constants.KAPTCHA_SESSION_KEY, captchaImageVO); //將圖片返回給前端 try(ServletOutputStream out = response.getOutputStream();) { BufferedImage bi = captchaProducer.createImage(capText); ImageIO.write(bi, "jpg", out); out.flush(); }//使用try-with-resources不用手動關閉流 } }

      我們要把CaptchaImageVO保存到session里面。所以該類中不要加圖片,只保存驗證碼文字和失效時間,用于后續驗證即可。把驗證碼圖片保存起來既沒有用處,又浪費內存。

      @Data public class CaptchaImageVO { //驗證碼文字 private String code; //驗證碼失效時間 private LocalDateTime expireTime; public CaptchaImageVO(String code, int expireAfterSeconds){ this.code = code; this.expireTime = LocalDateTime.now().plusSeconds(expireAfterSeconds); } //驗證碼是否失效 public boolean isExpried() { return LocalDateTime.now().isAfter(expireTime); } }

      三、驗證碼用戶訪問

      把如下代碼加入到登錄頁面合適的位置,注意圖片img標簽放到登錄表單中。

      實現的效果是,頁面初始化即加載驗證碼。以后每一次點擊,都會更新驗證碼。

      注意:一定設置width和height,否則圖片無法顯示。

      四、驗證碼之安全校驗

      編寫我們的自定義圖片驗證碼過濾器VerificationCodeFilter,過濾器中攔截登錄請求

      VerificationCodeFilter過濾器中從seesion獲取驗證碼文字與用戶輸入比對,比對通過執行其他過濾器鏈

      比對不通過,自定義一個異常,交給AuthenticationFailureHandler處理

      最后將VerificationCodeFilter放在UsernamePasswordAuthenticationFilter表單過濾器之前執行。

      以上是在Spring Security實現登錄驗證碼驗證的邏輯。如果你是使用的shiro或者其他的自定義的登錄驗證實現,那就更簡單了。就在你的登錄驗證的controller里面取出session比對驗證碼即可,不需要自定義過濾器。

      期待您的關注

      向您推薦博主的系列文檔:《手摸手教您學習SpringBoot系列-16章97節》

      本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。

      Spring

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:從課堂走向實踐還有多遠?
      下一篇:TX2刷機與相關軟件安裝
      相關文章
      亚洲日韩在线视频| 久久亚洲精品无码aⅴ大香| 亚洲欧洲自拍拍偷综合| 亚洲av福利无码无一区二区 | 国产L精品国产亚洲区久久| 亚洲?V乱码久久精品蜜桃| 亚洲国产欧美国产综合一区 | 亚洲成AV人片一区二区| 亚洲伊人久久精品影院| 亚洲色成人中文字幕网站| 亚洲日本va在线视频观看| 国产成A人亚洲精V品无码性色| 中文亚洲AV片不卡在线观看| 中文字幕精品亚洲无线码一区 | 国产亚洲美女精品久久久久狼 | 亚洲AV第一成肉网| 国产亚洲成在线播放va| 亚洲国产精品毛片av不卡在线| 亚洲国产综合精品中文字幕| 亚洲男女内射在线播放| 久久精品国产亚洲AV不卡| 中文字幕在亚洲第一在线 | 亚洲人成亚洲人成在线观看 | 亚洲av无码一区二区三区四区| 亚洲av色香蕉一区二区三区| 朝桐光亚洲专区在线中文字幕 | 亚洲成a人片在线观看老师| 久久久久亚洲精品天堂久久久久久| 国产亚洲AV夜间福利香蕉149| 亚洲自偷自偷图片| 亚洲国产精品久久久久婷婷老年| 亚洲人成电影福利在线播放| 亚洲黄色免费网站| 亚洲人成人网毛片在线播放| 亚洲成熟丰满熟妇高潮XXXXX| 亚洲av午夜精品一区二区三区| 久久精品亚洲男人的天堂| 亚洲国产精品成人精品无码区 | 亚洲人成人网站在线观看| 亚洲日韩精品射精日| 亚洲男人天堂av|