主要依赖: <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
spring相关依赖参照用到的另行添加。
package com.math.controller; import com.google.code.kaptcha.Producer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.awt.image.BufferedImage; import java.io.IOException; /** * @ClassName: VerifyCodeController * @Description: 图像验证码 * @author: math * @date: 2023/1/16 16:33 * @version: 1.0 */ @Controller @RequestMapping("/verifyCode") public class VerifyCodeController { public static final String KAPTCHA_SESSION_KEY = "kaptcha_key"; @Autowired private Producer producer = null; /** * @Author Math * @Description 生成验证码 * @Date 2023/1/16 * @Version 1.0 * @Param * @return **/ @RequestMapping("/getImg") public void getImg(HttpServletRequest request, HttpServletResponse response) throws Exception { ServletOutputStream out = null; try { // 设置页面不缓存 response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); response.addHeader("Cache-Control", "post-check=0, pre-check=0"); response.setHeader("Pragma", "no-cache"); // 生成验证码编码 String capText = producer.createText(); // 将验证码编码生成图片 BufferedImage kaptchaImage = producer.createImage(capText); // 输出验证码PNG格式图片 response.setHeader("content-type", "image/png"); out = response.getOutputStream(); ImageIO.write(kaptchaImage, "png", out); out.flush(); // 获取session,并将验证码编码存放到session中 HttpSession session = request.getSession(); session.setAttribute(KAPTCHA_SESSION_KEY, capText); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * @Author Math * @Description 检验验证码 * @Date 2023/1/16 * @Version 1.0 * @Param * @return **/ public boolean captchaVerify(HttpServletRequest request, String kaptchaCode) throws Exception { HttpSession session = request.getSession(); String code = (String) session.getAttribute(KAPTCHA_SESSION_KEY); System.out.println("kaptchaCode:" + kaptchaCode + " ;code:" + code); if (!StringUtils.isEmpty(kaptchaCode) && kaptchaCode.equalsIgnoreCase(code)) { // 检验通过 return true; } return false; } }
前端调用返回:
前端页面:
代码:
<div id="verifyBox">
<div class="cerify-code-panel">
<div class="verify-code" style="width: 100px; height: 40px; line-height: 40px; font-size: 20px; background-color: rgb(255, 255, 240); color: rgb(255, 153, 0);">
<img class="changeCodeAgain" id="verifyCodeImg" src="${pageContext.servletContext.contextPath }/verifyCode/getImg">
</div>
<div class="verify-code-area" style="width: 100px;">
<div class="verify-input-area"><input type="text" id="verifyCode" name="verifyCode" class="varify-input-code"></div>
<div class="verify-change-area changeCodeAgain"><a class="verify-change-code" >换一张</a></div>
</div>
</div>
</div>