日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot中验证码实现kaptcha

發布時間:2025/6/15 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot中验证码实现kaptcha 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要生成驗證碼網上的方案比較多,基本是基于兩大類:1為自定義生成,操作用Image類,2為kaptcha生成,有模糊算法。

當然也可以直接交由前端進行處理

1、基于kaptcha

首先不要懷疑的是報名是GitHub還是Google的,因為都是出自私人的產物,并且之前在Google Code進行托管,然后關閉了Google Code之后,有人就把其轉入到GitHub中,并且不只一個人,所以才會造成市面上這么多不同的報名。

但總體功能基本不變。

下面POM先引入包:

<!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha --> <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency>

這個包也不要懷疑,在GitHub上的星星是最多的。

KaptchaConfig.java

import java.util.Properties; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; @Component public class KaptchaConfig { @Bean public DefaultKaptcha getDefaultKaptcha(){ com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", "yes"); properties.setProperty("kaptcha.border.color", "105,179,90"); properties.setProperty("kaptcha.textproducer.font.color", "blue"); properties.setProperty("kaptcha.image.width", "110"); properties.setProperty("kaptcha.image.height", "40"); properties.setProperty("kaptcha.textproducer.font.size", "30"); properties.setProperty("kaptcha.session.key", "code"); properties.setProperty("kaptcha.textproducer.char.length", "4"); properties.setProperty("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }

這個配置文件可以寫成XML,然后通過在main方法使用@ImportResource進行導入XML配置:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha"> <property name="config"> <bean class="com.google.code.kaptcha.util.Config"> <constructor-arg type="java.util.Properties"> <props> <prop key = "kaptcha.border ">yes</prop> <prop key="kaptcha.border.color">105,179,90</prop> <prop key="kaptcha.textproducer.font.color">blue</prop> <prop key="kaptcha.image.width">100</prop> <prop key="kaptcha.image.height">50</prop> <prop key="kaptcha.textproducer.font.size">27</prop> <prop key="kaptcha.session.key">code</prop> <prop key="kaptcha.textproducer.char.length">4</prop> <prop key="kaptcha.textproducer.font.names">宋體,楷體,微軟雅黑</prop> <prop key="kaptcha.textproducer.char.string">0123456789ABCEFGHIJKLMNOPQRSTUVWXYZ</prop> <prop key="kaptcha.obscurificator.impl">com.google.code.kaptcha.impl.WaterRipple</prop> <prop key="kaptcha.noise.color">black</prop> <prop key="kaptcha.noise.impl">com.google.code.kaptcha.impl.DefaultNoise</prop> <prop key="kaptcha.background.clear.from">185,56,213</prop> <prop key="kaptcha.background.clear.to">white</prop> <prop key="kaptcha.textproducer.char.space">3</prop> </props> </constructor-arg> </bean> </property> </bean> </beans> @SpringBootApplication @ImportResource(locations={"classpath:mykaptcha.xml"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

注意:以上的main方法是導入XML文件的寫法,普通注解方式不需要這么寫。普通即可。

Controller,生成驗證碼

@Autowired DefaultKaptcha defaultKaptcha;@RequestMapping("/defaultKaptcha") public void defaultKaptcha(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception{ byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { //生產驗證碼字符串并保存到session中 String createText = defaultKaptcha.createText(); httpServletRequest.getSession().setAttribute("vrifyCode", createText); //使用生產的驗證碼字符串返回一個BufferedImage對象并轉為byte寫入到byte數組中 BufferedImage challenge = defaultKaptcha.createImage(createText); ImageIO.write(challenge, "jpg", jpegOutputStream); } catch (IllegalArgumentException e) { httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND); return; } //定義response輸出類型為image/jpeg類型,使用response輸出流輸出圖片的byte數組 captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); httpServletResponse.setHeader("Cache-Control", "no-store"); httpServletResponse.setHeader("Pragma", "no-cache"); httpServletResponse.setDateHeader("Expires", 0); httpServletResponse.setContentType("image/jpeg"); ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); }

驗證方法

@RequestMapping("/imgvrifyControllerDefaultKaptcha") public ModelAndView imgvrifyControllerDefaultKaptcha(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse){ ModelAndView andView = new ModelAndView(); String captchaId = (String) httpServletRequest.getSession().getAttribute("vrifyCode"); String parameter = httpServletRequest.getParameter("vrifyCode"); System.out.println("Session vrifyCode "+captchaId+" form vrifyCode "+parameter); if (!captchaId.equals(parameter)) { andView.addObject("info", "錯誤的驗證碼"); andView.setViewName("index"); } else { andView.addObject("info", "登錄成功"); andView.setViewName("succeed"); } return andView; }

配置項參考:

kaptcha.border 是否有邊框 默認為true 我們可以自己設置yes,no kaptcha.border.color 邊框顏色 默認為Color.BLACK kaptcha.border.thickness 邊框粗細度 默認為1 kaptcha.producer.impl 驗證碼生成器 默認為DefaultKaptcha kaptcha.textproducer.impl 驗證碼文本生成器 默認為DefaultTextCreator kaptcha.textproducer.char.string 驗證碼文本字符內容范圍 默認為abcde2345678gfynmnpwx kaptcha.textproducer.char.length 驗證碼文本字符長度 默認為5 kaptcha.textproducer.font.names 驗證碼文本字體樣式 默認為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) kaptcha.textproducer.font.size 驗證碼文本字符大小 默認為40 kaptcha.textproducer.font.color 驗證碼文本字符顏色 默認為Color.BLACK kaptcha.textproducer.char.space 驗證碼文本字符間距 默認為2 kaptcha.noise.impl 驗證碼噪點生成對象 默認為DefaultNoise kaptcha.noise.color 驗證碼噪點顏色 默認為Color.BLACK kaptcha.obscurificator.impl 驗證碼樣式引擎 默認為WaterRipple kaptcha.word.impl 驗證碼文本字符渲染 默認為DefaultWordRenderer kaptcha.background.impl 驗證碼背景生成器 默認為DefaultBackground kaptcha.background.clear.from 驗證碼背景顏色漸進 默認為Color.LIGHT_GRAY kaptcha.background.clear.to 驗證碼背景顏色漸進 默認為Color.WHITE kaptcha.image.width 驗證碼圖片寬度 默認為200 kaptcha.image.height 驗證碼圖片高度 默認為50

2、自定義方案

驗證碼生成類

import java.awt.*; import java.awt.image.BufferedImage; import java.io.OutputStream;import java.util.HashMap; import java.util.Map;import java.util.Random;public class ImageCode {private static char mapTable[] = {'0', '1', '2', '3', '4', '5','6', '7', '8', '9', '0', '1','2', '3', '4', '5', '6', '7','8', '9'};public static Map<String, Object> getImageCode(int width, int height, OutputStream os) {Map<String,Object> returnMap = new HashMap<String, Object>();if (width <= 0) width = 60;if (height <= 0) height = 20;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 獲取圖形上下文Graphics g = image.getGraphics();//生成隨機類Random random = new Random();// 設定背景色g.setColor(getRandColor(200, 250));g.fillRect(0, 0, width, height);//設定字體g.setFont(new Font("Times New Roman", Font.PLAIN, 18));// 隨機產生168條干擾線,使圖象中的認證碼不易被其它程序探測到g.setColor(getRandColor(160, 200));for (int i = 0; i < 168; i++) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(12);int yl = random.nextInt(12);g.drawLine(x, y, x + xl, y + yl);}//取隨機產生的碼String strEnsure = "";//4代表4位驗證碼,如果要生成更多位的認證碼,則加大數值for (int i = 0; i < 4; ++i) {strEnsure += mapTable[(int) (mapTable.length * Math.random())];// 將認證碼顯示到圖象中g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));//直接生成String str = strEnsure.substring(i, i + 1);g.drawString(str, 13 * i + 6, 16);}// 釋放圖形上下文 g.dispose();returnMap.put("image",image);returnMap.put("strEnsure",strEnsure);return returnMap;}//給定范圍獲得隨機顏色static Color getRandColor(int fc, int bc) {Random random = new Random();if (fc > 255) fc = 255;if (bc > 255) bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);} }

獲取驗證碼API

@RequestMapping(value = "/images/imagecode") public String imagecode(HttpServletRequest request, HttpServletResponse response) throws Exception {OutputStream os = response.getOutputStream();Map<String,Object> map = ImageCode.getImageCode(60, 20, os);String simpleCaptcha = "simpleCaptcha";request.getSession().setAttribute(simpleCaptcha, map.get("strEnsure").toString().toLowerCase());request.getSession().setAttribute("codeTime",new Date().getTime());try {ImageIO.write((BufferedImage) map.get("image"), "JPEG", os);} catch (IOException e) {return "";}return null; }

驗證驗證碼API

@RequestMapping(value = "/checkcode") @ResponseBody public String checkcode(HttpServletRequest request, HttpSession session) throws Exception {String checkCode = request.getParameter("checkCode");Object cko = session.getAttribute("simpleCaptcha") ; //驗證碼對象if(cko == null){request.setAttribute("errorMsg", "驗證碼已失效,請重新輸入!");return "驗證碼已失效,請重新輸入!";}String captcha = cko.toString();Date now = new Date();Long codeTime = Long.valueOf(session.getAttribute("codeTime")+"");if(StringUtils.isEmpty(checkCode) || captcha == null || !(checkCode.equalsIgnoreCase(captcha))) {request.setAttribute("errorMsg", "驗證碼錯誤!");return "驗證碼錯誤!";} else if ((now.getTime()-codeTime)/1000/60>5) {//驗證碼有效時長為5分鐘request.setAttribute("errorMsg", "驗證碼已失效,請重新輸入!");return "驗證碼已失效,請重新輸入!";}else {session.removeAttribute("simpleCaptcha");return "1";} }

?

?

參考:

http://blog.csdn.net/u014104286/article/details/70515004

http://blog.csdn.net/liunian02050328/article/details/53462053

http://www.jb51.net/article/115800.htm

http://blog.csdn.net/rambo_china/article/details/7720181

http://www.jianshu.com/p/7a37077a41e4

http://www.voidcn.com/article/p-ewnhqlod-bmc.html

==>如有問題,請聯系我:easonjim#163.com,或者下方發表評論。<==

總結

以上是生活随笔為你收集整理的Spring Boot中验证码实现kaptcha的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人h | 免费观看黄色av | 久久精品午夜福利 | 日本一区不卡在线 | 狠狠躁夜夜躁 | xxxx精品| 三年大全国语中文版免费播放 | 香蕉视频传媒 | 日韩欧美精品国产 | 在线视频免费观看一区 | 亚洲不卡在线 | 日本欧美在线 | 欧美性猛交xxx乱久交 | 日韩欧美中文一区 | 精品欧美久久 | 青青草成人在线观看 | 成人精品福利视频 | 麻豆视频传媒入口 | xxx黄色片 | 在线免费视频 | free性满足hd国产精品久 | 一级做a爰片毛片 | 91九色pron | 黑人玩弄人妻一区二区三区 | 免费国产网站 | 日韩精品美女 | 不卡的av在线免费观看 | 国产资源在线视频 | fexx性欧美 | 中国1级毛片 | 午夜理伦三级理论 | 亚洲综合激情五月久久 | www黄色com | 潘金莲一级淫片aaaaa武则天 | 亚洲天堂少妇 | 亚洲天堂精品视频 | 污污网站在线 | 椎名由奈在线观看 | 又黄又爽一区二区三区 | 黄色三级a | 九色在线视频 | 99精品在线观看视频 | 婷婷开心激情网 | 国产精品久久久久久亚洲毛片 | 国产探花视频在线观看 | 欧美精品免费视频 | 精品免费在线视频 | 最新中文字幕在线播放 | 日韩中文字幕av在线 | 欧美福利小视频 | 在线午夜视频 | 欧美黑吊大战白妞欧美大片 | 亚洲国产精品成人va在线观看 | 瑟瑟在线视频 | www操| 亚洲一区二区三区高清视频 | 麻豆一区在线 | av成人资源 | 91精品免费在线观看 | 久久精品欧美日韩 | 久久香蕉影院 | av手机版 | 青青草华人在线视频 | 少妇精品久久久一区二区三区 | 夜夜se | 在线看污片 | 成人黄色一级 | 美女扒开腿让男人捅 | 成人国产一区二区三区精品麻豆 | 高h免费视频| 欧美xxxⅹ性欧美大片 | 欧美成人精品激情在线观看 | 91video| 国产欧美日韩免费 | 国产成人免费在线 | 欧美freesex黑人又粗又大 | 在线免费看mv的网站入口 | 亚洲色图p | 日韩一区二区三区av | 男女做事网站 | 成人一级免费视频 | 四虎图库 | 欧美亚洲成人网 | 国产精品无码99re | 午夜视频日韩 | 免费一级特黄特色大片 | 一吻定情2013日剧 | 精品欧美一区二区三区久久久 | 久久丫精品久久丫 | 国产在线日本 | 影音先锋国产在线 | www.久久婷婷 | 国产不卡毛片 | 亚欧在线视频 | 日韩av麻豆 | 欧美不卡影院 | 日本一区视频在线播放 | 日韩欧美亚洲一区二区三区 | 福利所导航 |