您好,登錄后才能下訂單哦!
本篇內容主要講解“SpringBoot+kaptcha怎么實現驗證碼”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot+kaptcha怎么實現驗證碼”吧!
kaptcha 是一個非常老牌的驗證碼生成工具,多老呢?可以追溯到 2006 年。
這么多年過去了,它不僅沒有落寞反而還在被不少人使用,足以說明它的生命力了,值得我們來研究下。
方便起見,我們整一個 Spring Boot 工程來演示它的用法。
首先新建一個 Spring Boot 工程,然后加入 kaptcha 的依賴,如下:
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
接下來我們只需要提供一個配置 Kaptcha 的 Bean 即可,如下:
@Configuration public class KaptchaConfig { @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有邊框 默認為true 我們可以自己設置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 驗證碼文本字符顏色 默認為Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 驗證碼圖片寬度 默認為200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 驗證碼圖片高度 默認為50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 驗證碼文本字符大小 默認為40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 驗證碼文本字符長度 默認為5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 驗證碼文本字體樣式 默認為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 圖片樣式 水紋com.google.code.kaptcha.impl.WaterRipple 魚眼com.google.code.kaptcha.impl.FishEyeGimpy 陰影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }
DefaultKaptcha 中配置驗證碼圖片的各個屬性值。各個屬性的含義,代碼中都有注釋,我就不再多說了。
接下來我們在接口中返回驗證碼圖片,如下:
@Autowired DefaultKaptcha defaultKaptcha; @GetMapping("/img") public void getKaptcha(HttpServletResponse resp) throws IOException { String text = defaultKaptcha.createText(); BufferedImage image = defaultKaptcha.createImage(text); ImageIO.write(image, "jpg", resp.getOutputStream()); }
我這里是通過 IO 流的形式將圖片寫到前端的,當然也可以將之轉為一個 Base64 字符串返回到前端,一樣也是 OK 的。
等等,似乎少了什么!
我們沒有把生成的驗證碼文本存入到 session 中去,這樣一會登錄的時候沒法驗證,有小伙伴可能會說,這還不簡單?接口里邊存一下不就行了?
NONONO!
大家看,當我們配置 DefaultKaptcha bean 的時候,其中有這么一行代碼 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
,這行代碼的意思就是說會自動將生成的驗證碼文本存入到 session 中,并且 session 的 KEY 是 kaptchaCode。但是在實際測試中,大家會發現上面的代碼并不會將驗證碼生成的文本存入到 session 中。
原因在于 Kaptcha 工具實際上自己提供了一個生成驗證碼圖片的 Servlet,如果我們直接使用它自己提供的驗證碼 Servlet,那么上面這個配置才會生效,在 Spring Boot 中,如果想要配置 Kaptcha 自己提供的 Servlet,方式如下:
@Bean ServletRegistrationBean<HttpServlet> kaptchaServlet() { ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<>(); bean.setServlet(new KaptchaServlet()); bean.addUrlMappings("/img"); Properties properties = new Properties(); // 是否有邊框 默認為true 我們可以自己設置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 驗證碼文本字符顏色 默認為Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 驗證碼圖片寬度 默認為200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 驗證碼圖片高度 默認為50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 驗證碼文本字符大小 默認為40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 驗證碼文本字符長度 默認為5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 驗證碼文本字體樣式 默認為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 圖片樣式 水紋com.google.code.kaptcha.impl.WaterRipple 魚眼com.google.code.kaptcha.impl.FishEyeGimpy 陰影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Map<String, String> map = new HashMap<String,String>((Map)properties); bean.setInitParameters(map); return bean; }
項目啟動后,直接訪問 /img
就能看到驗證碼圖片,此時驗證碼的文本也會自動存入到 session 中。當用戶登錄的時候,通過 session.getAttribute("kaptchaCode")
就可以獲取到驗證碼的文本內容。
然而很多時候,驗證碼接口返回的內容都是比較豐富的,可能不僅僅是圖片,還有其他信息。所以我們直接配一個 Servlet 并不能滿足我們的要求,只能自己寫驗證碼的接口,自己寫的話,就要自己把驗證碼圖片存到 session 中去,那么 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
配置其實就沒用了,可以不用加。
當然,我們也可以自定義驗證碼文本,只需要提供一個驗證碼文本的實現類即可,如下:
public class KaptchaTextCreator extends DefaultTextCreator { private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); @Override public String getText() { Integer result = 0; Random random = new Random(); int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); int randomoperands = (int) Math.round(Math.random() * 2); if (randomoperands == 0) { result = x * y; suChinese.append(CNUMBERS[x]); suChinese.append("*"); suChinese.append(CNUMBERS[y]); } else if (randomoperands == 1) { if (!(x == 0) && y % x == 0) { result = y / x; suChinese.append(CNUMBERS[y]); suChinese.append("/"); suChinese.append(CNUMBERS[x]); } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } } else if (randomoperands == 2) { if (x >= y) { result = x - y; suChinese.append(CNUMBERS[x]); suChinese.append("-"); suChinese.append(CNUMBERS[y]); } else { result = y - x; suChinese.append(CNUMBERS[y]); suChinese.append("-"); suChinese.append(CNUMBERS[x]); } } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } suChinese.append("=?@" + result); return suChinese.toString(); } }
這段代碼并不難理解,生成的驗證碼文本類似于 1+1=?@2
這樣的字符串。
將來以@為分界線,將@前面的字符串內容繪制到圖片上,@后面的內容存到 session 中,和用戶上傳的內容進行比較即可。
當然,我們還需要在配置驗證碼的時候添加如下屬性,以修改驗證碼文本的提供類:
properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "org.javaboy.tienchin.framework.config.KaptchaTextCreator");
配置完成后,將來在接口中直接使用這個驗證碼即可,用的時候注意將生成的驗證碼文本拆分后處理,一部分用來繪圖,一部分用來存到 session 中。
到此,相信大家對“SpringBoot+kaptcha怎么實現驗證碼”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。