这几天完成需求的时候,用户注册需要写一个随机产生的验证码,所以就用到了google的kaptcha验证码工具,以下是实现步骤和相关代码:
一: 添加依赖:
在pom.xml中添加依赖,相关代码为:
<!-- 验证码校验-->
<!-- Kaptcha验证码组件-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
二:写入KaptchaConfig,便于@Bean注入
如果没有这一步,就会产生一些404 not find 对象的相关错误,所以大家千万不要忘记写相关代码,代码和相关含义由下显示:
@Configuration
public class KaptchaConfig {
@Bean
public DefaultKaptcha getDefaultKaptcha() {
DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
Properties properties=new Properties();
//是否有边框
properties.setProperty(Constants.KAPTCHA_BORDER,"yes");
//验证码文本颜色
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR,"blue");
//验证码图片宽度
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH,"160");
//验证码图片高度
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT,"60");
//文本字符大小
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE,"38");
//验证码session的值
properties.setProperty(Constants.KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode");
//验证码文本长度
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH,"4");
//字体
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
注: Config的import是
com.google.code.kaptcha.util.Config; 别impport错类了
如果您用的是SSM框架, 也就是把相关代码放在applicationContext.xml文件中 相关代码如下显示:
<!--配置Kaptcha -->
<bean id="kaptchaProducer" 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">yes</prop>
<!-- 验证码图片宽度为120像素-->
<prop key="kaptcha.image.width">160</prop>
<!-- 验证码图片字体颜色为蓝色-->
<prop key="kaptcha.textproducer.font.color">blue</prop>
<!-- 每个字符最大占用40像素 长度不够会进行缩小-->
<prop key="kaptcha.textproducer.font.size">60</prop>
<!-- 验证码包含4个字符 -->
<prop key="kaptcha.textproducer.char.length">4</prop>
</props>
</constructor-arg>
</bean>
</property>
</bean>
对比起来其实都差不多
三: 书写相关Controller层:
@Controller
public class KaptchaController {
@Resource
private Producer kaptchaProducer;
@GetMapping("verify_code")
public void createVerifyCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
//响应立即过期
response.setDateHeader("Expires", 0);
//不缓存任何图片数据
response.setHeader("Cache-Control", "no-store,no-cache,must-revalidate");
response.setHeader("Cache-Control", "post-check=0,pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/png");
//生成验证码字符文本
String verifyCode = kaptchaProducer.createText();
request.getSession().setAttribute("kaptchaVerifyCode", verifyCode);
System.out.println(request.getSession().getAttribute("kaptchaVerifyCode"));
BufferedImage image = kaptchaProducer.createImage(verifyCode);//创建验证图片
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "png", out);
//输出和关闭输出
out.flush();
out.close();
}
然后完整的代码就此实现,后端我UserController调用只用一句
String verifyCode = (String) request.getSession().getAttribute("kaptchaVerifyCode");
就可以获得得到的验证码,然后进行一些验证即可。
四:Postman进行后端验证
总结
上午用的时候忘记写Config,所以出现挺多错误,大家别忘记写相关代码