文章目录
在pom.xml中添加依赖
<!-- 1. 添加kaptcha的依赖 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
在applicationContext.xml中进行配置
<!-- 配置Kaptcha -->
<bean id="kaptcheProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
<property name="config">
<bean class="com.google.code.kaptcha.util.Config">
<constructor-arg>
<props>
<!-- 验证码图片不生成边框 -->
<prop key="kaptcha.border">no</prop>
<!-- 验证码图片宽度为120px -->
<prop key="kaptcha.image.width">120</prop>
<!-- 验证码图片字体颜色为blue -->
<prop key="kaptcha.textproducer.font.color">blue</prop>
<!-- 验证码图片每个字符最大占用40个像素-->
<prop key="kaptcha.textproducer.font.size">40</prop>
<!-- 验证码图包含四个字符-->
<prop key="kaptcha,textproducer.char.length">4</prop>
</props>
</constructor-arg>
</bean>
</property>
</bean>
KaptchaController.java
package com.imooc.reader.controller;
import com.google.code.kaptcha.Producer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
@Controller
public class KaptchaController {
@Resource
private Producer kaptcheProducer;
/**
* 参数为两个原生对象
* SpringMvc底层还是依赖于将j2ee的web模块也就是servelet,我们在实际开发中,有一些特殊的场景必须要使用到原生的请求或者响应对象,
* 此时就可以如下书写方式,把原生对象放在参数列表中,这样在运行时会动态注入
* @param request
* @param response
*/
@GetMapping("/verify_code")
public void createVerifyCode(HttpServletRequest request, HttpServletResponse response){
// 响应立即过期
response.setDateHeader("Expires", 0); // 设置过期时间
// 不缓存任何图片数据
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidation");
response.setHeader("Cache-Control", "post=check=0,pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/png");
// 生成验证码字符文本
String verifyCode = kaptcheProducer.createText();
// 将验证码保存到了当前会话当中
request.getSession().setAttribute("kaptchaVerifyCode", verifyCode);
System.out.println(request.getSession().getAttribute("kaptchaVerifyCode"));
BufferedImage image = kaptcheProducer.createImage(verifyCode);// 根据验证码文本创建验证码图片
ServletOutputStream out = null; // 由于图片是二进制,所以用outputstream,如果不是二进制,用getWriter
try {
out = response.getOutputStream();
ImageIO.write(image, "png", out);
out.flush(); // 立即输出
out.close(); // 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}