准备工作:
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);
- }
- }
- @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;
- }
- <!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的,但是它们最好不要在一个工程中使用,因为用到了相同的类,可能导致异常。