@Configuration public class KaptchaConfig { @Bean public Producer kaptchaProducer (){ //实例化接口 Properties properties = new Properties(); properties.setProperty("kaptcha.image.width","100"); properties.setProperty("kaptcha.image.height","40"); properties.setProperty("kaptcha.textproducer.font.size","32"); properties.setProperty("kaptcha.textproducer.font.color","0,0,0"); properties.setProperty("kaptcha.textproducer.char.string","0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); properties.setProperty("kaptcha.textproducer.char.length","4"); //properties.setProperty("kaptcha.noise.impl","4");//设置干扰的噪声类 properties.setProperty("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise"); DefaultKaptcha kaptcha = new DefaultKaptcha(); Config config = new Config(properties); //Config 需要传入Properties对象<k,V >类似Map.所有的对象都是config去配的, 但是config依赖Properties对象 kaptcha.setConfig(config); return kaptcha; } }
private static final Logger logger = LoggerFactory.getLogger(LoginController.class); @Autowired private UserService userService; @Autowired private Producer kaptchaProducer; /** * 生成验证码的方法 * 返回值是void 向浏览器输出的是一个图片,不是字符串也不是一个网页。 * 需要自己手动的向浏览器输出。需要用Response。 * 生成验证码后,服务端需要记住,对再次登录时,验证 验证码是否正确。 * 不能存浏览器端,容易被盗取(敏感信息) 跨请求,Cookie或者Session————Session */ @RequestMapping(path="/kaptcha", method = RequestMethod.GET) public void getKaptcha(HttpServletResponse response, HttpSession session){ //生成验证码 String text = kaptchaProducer.createText(); BufferedImage image = kaptchaProducer.createImage(text); //将验证码存入Session ,便于以后使用 session.setAttribute("kaptcha",text); //将图片输出给浏览器 response.setContentType("image/png"); //声明给浏览器返回的是什么格式的数据 //response获取输出流 try { //response.getWriter();//获取字符流 OutputStream stream =response.getOutputStream();//获取字节流,图片,比较好一点 ImageIO.write(image,"png",stream); //可不用关闭,因为整个流都是由Response去维护的,会自动关 } catch (IOException e) { logger.error("响应验证码失败:"+e.getMessage()); } }
这访问http://localhost:8080/community/kaptcha,就可以看到生成的图片。刷新会更新。
<img th:src="@{/kaptcha}" id= "kaptcha" style="width:100px;height:40px;" class="mr-2"/> <a href="javascript:refresh_kaptcha();" class="font-size-12 align-bottom">刷新验证码</a>
<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script> <script> function refresh_kaptcha(){ var path= CONTEXT_PATH + "kaptcha?p="+Math.random(); ${"#kaptcha"}.attr("src",path); } </script>