SpringBoot 集成Kaptcha实现验证码功能实例详解
在一个web应用中验证码是一个常见的元素。不管是防止机器人还是爬虫都有一定的作用,我们是自己编写生产验证码的工具类,也可以使用一些比较方便的验证码工具。在网上收集一些资料之后,今天给大家介绍一下kaptcha的和springboot一起使用的简单例子。 准备工作: 1.你要有一个springboot的hello world的工程,并能正常运行。 2.导入kaptcha的maven: <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> 开始实验: 我们有两种方式在springboot中使用kaptcha 第一种使用.xml的配置方式配置生成kaptcha的bean对象,在启动类上@ImportResource这个xml文件;在controller中注入其对象并使用 第二种是把kaptcha作为工程的一个类,加上@component注解在返回kaptcha的方法中加上@Bean注解,再在controller中注入其对象。 第一种方法: 在resources中创建一个xxx.xml文件 如: mykaptcha.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> 在springboot启动类上引入这个文件 @SpringBootApplication @ImportResource(locations={"classpath:mykaptcha.xml"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } } 在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; } 模板html: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8" /> <title>hello</title> </head> <body> <h1 th:text="${info}" /> <div> <!-- <img alt="这是图片" src="/img/001.png"/> --> <img alt="验证码" onclick = "this.src='/defaultKaptcha?d='+new Date()*1" src="/defaultKaptcha" /> </div> <form action="imgvrifyControllerDefaultKaptcha"> <input type="text" name="vrifyCode" /> <input type="submit" value="提交"></input> </form> </body> </html> 启动并访问: 提交: 第二中方发: 这种方法把.xml文件换成使用代码来配置: 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,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文件,不然会有两个相同的对象,而你没有指明要注入哪一个的话启动会失败。 启动并测试: 到这里就算成功了。(也有使用jcaptcha的,只是他们最好不要再一个工程中使用,使用到了相同的类,有时候会导致异常。) 补充:对于kaptcha的配置属性大家可以找找,根据属性就可以配置了。 总结 以上所述是小编给大家介绍的SpringBoot 集成Kaptcha实现验证码功能实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持! 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 在实现带有生成ids的实体的equals()时,最佳做法是什
- 【leetcode】1184. Distance Between Bus Stops
- Java中的强制导向布局实现
- Spring Security 构建rest服务实现rememberme 记住我功能
- 虚拟机 – 将VHD导入到Parallels Desktop 6在Mac上
- 您更喜欢哪种Java Web Service Framework?
- java – 加权快速联合路径压缩算法
- 14-01 Java matches类,Pattern类,matcher类
- java – 如何在postgres中设置锁定超时 – Hibernate
- Java(2)多线程