日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
驗(yàn)證碼的花式玩法,讓我們試試

1. 基本用法

kaptcha 是一個(gè)非常老牌的驗(yàn)證碼生成工具,多老呢?可以追溯到 2006 年。

10年的溆浦網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整溆浦建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“溆浦網(wǎng)站設(shè)計(jì)”,“溆浦網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

這么多年過去了,它不僅沒有落寞反而還在被不少人使用,足以說明它的生命力了,值得我們來研究下。

方便起見,我們整一個(gè) Spring Boot 工程來演示它的用法。

首先新建一個(gè) Spring Boot 工程,然后加入 kaptcha 的依賴,如下:


com.github.penggle
kaptcha
2.3.2

接下來我們只需要提供一個(gè)配置 Kaptcha 的 Bean 即可,如下:

@Configuration
public class KaptchaConfig {
@Bean(name = "captchaProducer")
public DefaultKaptcha getKaptchaBean() {
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否有邊框 默認(rèn)為true 我們可以自己設(shè)置yes,no
properties.setProperty(KAPTCHA_BORDER, "yes");
// 驗(yàn)證碼文本字符顏色 默認(rèn)為Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
// 驗(yàn)證碼圖片寬度 默認(rèn)為200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 驗(yàn)證碼圖片高度 默認(rèn)為50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 驗(yàn)證碼文本字符大小 默認(rèn)為40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
// 驗(yàn)證碼文本字符長度 默認(rèn)為5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 驗(yàn)證碼文本字體樣式 默認(rèn)為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 中配置驗(yàn)證碼圖片的各個(gè)屬性值。各個(gè)屬性的含義,代碼中都有注釋,我就不再多說了。

接下來我們在接口中返回驗(yàn)證碼圖片,如下:

@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 流的形式將圖片寫到前端的,當(dāng)然也可以將之轉(zhuǎn)為一個(gè) Base64 字符串返回到前端,一樣也是 OK 的。

等等,似乎少了什么!

我們沒有把生成的驗(yàn)證碼文本存入到 session 中去,這樣一會登錄的時(shí)候沒法驗(yàn)證,有小伙伴可能會說,這還不簡單?接口里邊存一下不就行了?

NONONO!

大家看,當(dāng)我們配置 DefaultKaptcha bean 的時(shí)候,其中有這么一行代碼 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");,這行代碼的意思就是說會自動(dòng)將生成的驗(yàn)證碼文本存入到 session 中,并且 session 的 KEY 是 kaptchaCode。但是在實(shí)際測試中,大家會發(fā)現(xiàn)上面的代碼并不會將驗(yàn)證碼生成的文本存入到 session 中。

原因在于 Kaptcha 工具實(shí)際上自己提供了一個(gè)生成驗(yàn)證碼圖片的 Servlet,如果我們直接使用它自己提供的驗(yàn)證碼 Servlet,那么上面這個(gè)配置才會生效,在 Spring Boot 中,如果想要配置 Kaptcha 自己提供的 Servlet,方式如下:

@Bean
ServletRegistrationBean kaptchaServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean<>();
bean.setServlet(new KaptchaServlet());
bean.addUrlMappings("/img");
Properties properties = new Properties();
// 是否有邊框 默認(rèn)為true 我們可以自己設(shè)置yes,no
properties.setProperty(KAPTCHA_BORDER, "yes");
// 驗(yàn)證碼文本字符顏色 默認(rèn)為Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
// 驗(yàn)證碼圖片寬度 默認(rèn)為200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 驗(yàn)證碼圖片高度 默認(rèn)為50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 驗(yàn)證碼文本字符大小 默認(rèn)為40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
// 驗(yàn)證碼文本字符長度 默認(rèn)為5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 驗(yàn)證碼文本字體樣式 默認(rèn)為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 map = new HashMap((Map)properties);
bean.setInitParameters(map);
return bean;
}

項(xiàng)目啟動(dòng)后,直接訪問 /img 就能看到驗(yàn)證碼圖片,此時(shí)驗(yàn)證碼的文本也會自動(dòng)存入到 session 中。當(dāng)用戶登錄的時(shí)候,通過 session.getAttribute("kaptchaCode") 就可以獲取到驗(yàn)證碼的文本內(nèi)容。

然而很多時(shí)候,驗(yàn)證碼接口返回的內(nèi)容都是比較豐富的,可能不僅僅是圖片,還有其他信息。所以我們直接配一個(gè) Servlet 并不能滿足我們的要求,只能自己寫驗(yàn)證碼的接口,自己寫的話,就要自己把驗(yàn)證碼圖片存到 session 中去,那么 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); 配置其實(shí)就沒用了,可以不用加。

2. 自定義驗(yàn)證碼文本

當(dāng)然,我們也可以自定義驗(yàn)證碼文本,只需要提供一個(gè)驗(yàn)證碼文本的實(shí)現(xiàn)類即可,如下:

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();
}
}

這段代碼并不難理解,生成的驗(yàn)證碼文本類似于 1+1=?@2 這樣的字符串。

將來以 @ 為分界線,將 @ 前面的字符串內(nèi)容繪制到圖片上,@ 后面的內(nèi)容存到 session 中,和用戶上傳的內(nèi)容進(jìn)行比較即可。

當(dāng)然,我們還需要在配置驗(yàn)證碼的時(shí)候添加如下屬性,以修改驗(yàn)證碼文本的提供類:

roperties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "org.javaboy.tienchin.framework.config.KaptchaTextCreator");

配置完成后,將來在接口中直接使用這個(gè)驗(yàn)證碼即可,用的時(shí)候注意將生成的驗(yàn)證碼文本拆分后處理,一部分用來繪圖,一部分用來存到 session 中。


網(wǎng)頁標(biāo)題:驗(yàn)證碼的花式玩法,讓我們試試
文章起源:http://www.5511xx.com/article/djidgoh.html