一、Kaptcha概述
Kaptcha是一個開源的驗證碼生成工具,它由Java語言編寫,具有易用性和可擴展性。它可以生成各種類型的驗證碼圖像,例如數字、字符、中文、算術表達式等等。Kaptcha的主要特點是生成的驗證碼圖像具有一定的干擾效果,這可以有效地防止機器人攻擊。
Kaptcha的安裝非常簡單,只需要在Maven配置文件中添加以下依賴即可:
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
二、Kaptcha的使用
使用Kaptcha生成驗證碼非常簡單,只需要以下幾步:
1、在Spring配置文件中配置Kaptcha Bean:
<bean id="kaptcha" class="com.google.code.kaptcha.impl.DefaultKaptcha"> <property name="config"> <bean class="com.google.code.kaptcha.util.Config"> <property name="width" value="150" /> <property name="height" value="50" /> <property name="textProducerCharLength" value="4" /> <property name="textProducerFontNames" value="Arial, Courier" /> <property name="noiseImpl" value="com.google.code.kaptcha.impl.NoNoise" /> <property name="obscurificatorImpl" value="com.google.code.kaptcha.impl.ShadowGimpy" /> <property name="textProducerImpl" value="com.google.code.kaptcha.text.DefaultTextCreator" /> </bean> </property> </bean>
其中height和width屬性可以設置驗證碼圖像的大小,textProducerCharLength屬性用於設置驗證碼的長度,textProducerFontNames屬性是字體的名稱,noiseImpl和obscurificatorImpl屬性設置生成驗證碼圖像的干擾效果,textProducerImpl屬性是生成驗證碼的類型。
2、在Controller中使用Kaptcha生成驗證碼:
@Controller public class UserController { @Autowired private DefaultKaptcha kaptcha; @GetMapping("/login") public String login() { return "login"; } @PostMapping("/login") public String login(String username, String password, String code, HttpSession session) { String kaptchaText = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY); if (!kaptchaText.equals(code)) { return "redirect:/login?error"; } // Do login return "redirect:/home"; } @GetMapping("/code") public void generateCode(HttpServletRequest request, 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 kaptchaText = kaptcha.createText(); session.setAttribute(Constants.KAPTCHA_SESSION_KEY, kaptchaText); BufferedImage image = kaptcha.createImage(kaptchaText); ServletOutputStream out = response.getOutputStream(); ImageIO.write(image, "jpg", out); out.flush(); } }
在登錄表單中,使用標籤來生成驗證碼的圖片,例如:
<label>驗證碼:</label> <input type="text" name="code" required> <img src="/code" onclick="this.src='/code?' + Math.random()" title="看不清?點擊更換" />
在generateCode方法中,使用Kaptcha生成驗證碼圖像,並將驗證碼文本保存到Session中。該方法將生成的驗證碼圖像輸出到客戶端瀏覽器。
三、Kaptcha的自定義
Kaptcha提供了很多可定製的選項,例如字體類型、干擾效果等等。除了配置文件中提供的屬性外,我們還可以創建自己的Kaptcha類,覆蓋其中的方法來實現自定義的驗證碼生成規則。
例如我們可以創建一個類MyKaptcha,將其中的textProducerImpl屬性設置為自定義的實現類MyTextCreator,覆蓋其中的createText方法,生成包含字母和數字的4位驗證碼文本。代碼如下:
public class MyKaptcha extends DefaultKaptcha { @Override public Producer getTextProducer() { if (textProducer == null) { textProducer = new MyTextCreator(getTextProducerCharString()); } return textProducer; } } public class MyTextCreator extends DefaultTextCreator { public MyTextCreator(String charString) { super(charString); } @Override public String createText() { String text = super.createText(); return text.replaceAll("[^a-zA-Z0-9]", ""); // 只包含字母和數字 } }
然後可以在Spring配置文件中將Kaptcha Bean配置成我們自己創建的MyKaptcha,生成的驗證碼就是包含字母和數字的4位驗證碼文本了。
四、Kaptcha的優化
雖然Kaptcha已經非常強大,但是我們也可以在某些方面對其進行優化,例如:
1、使用base64編碼生成驗證碼,減少網絡請求次數。
2、將驗證碼文本存儲在Redis緩存中,避免服務器重啟後驗證碼失效。
3、使用異步請求生成驗證碼,提高系統性能。
4、將驗證碼文本存儲在數據庫中,方便後續統計和監控。
以上優化措施可以根據具體的情況來選擇或者結合使用,可以幫助我們更好的使用Kaptcha來生成驗證碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/191070.html