当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot 集成Kaptcha实现验证码功能实例详解

SpringBoot 集成Kaptcha实现验证码功能实例详解

2019年07月19日  | 移动技术网IT编程  | 我要评论

千股千评全景网,达斯科波波夫,2014年国庆阅兵

在一个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,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文件,不然会有两个相同的对象,而你没有指明要注入哪一个的话启动会失败。

启动并测试:

到这里就算成功了。(也有使用jcaptcha的,只是他们最好不要再一个工程中使用,使用到了相同的类,有时候会导致异常。)

补充:对于kaptcha的配置属性大家可以找找,根据属性就可以配置了。

总结

以上所述是小编给大家介绍的springboot 集成kaptcha实现验证码功能实例详解,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网