怎么我的云表格打不開(為什么云文檔打不開)
835
2022-05-30
一、驗證碼生成之配置使用kaptcha
使用google開源的驗證碼實現類庫kaptcha,通過maven坐標引入
假設我們的配置文件是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小時內刪除侵權內容。