一、什么是Kaptcha
Kaptcha是Google开发的用于自动生成验证码的插件。
二、怎么导入Kaptcha
① 如果没有用Maven管理工具的话就直接导入包(可以直接下载:pau8)
https://pan.baidu.com/s/11225kEsyIFPntYQF9lT2-A
② 用Maven的话,有两个地址可以用,一个是Google那边的,一个是把搬到Github上的
<dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId>kaptcha</artifactId> <version>2.3</version> </dependency>
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
三、页面的代码
<tr> <td><input type="text" id="user_input_verifyCode" name="user_input_verifyCode" placeholder="验证码" maxlength="4"></td> <td><img src="${pageContext.request.contextPath }/kaptcha" width="110" height="40" id="verifyCodeImage"></td> <td><a id="changeVerifImageRegister" onclick="javascript:changeImage();">换一张</a></td></tr>
四、写在配置数据库的springX.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.image.width">138</prop> <!-- 验证码高度 --> <prop key="kaptcha.image.height">28</prop> <!-- 生成验证码内容范围 --> <prop key="kaptcha.textproducer.char.string">0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</prop> <!-- 验证码个数 --> <prop key="kaptcha.textproducer.char.length">4</prop> <!-- 是否有边框 --> <prop key="kaptcha.border">no</prop> <!-- 边框颜色 --> <prop key="kaptcha.border.color">105,179,50</prop> <!-- 边框厚度 --> <prop key="kaptcha.border.thickness">1</prop> <!-- 验证码字体颜色 --> <prop key="kaptcha.textproducer.font.color">black</prop> <!-- 验证码字体大小 --> <prop key="kaptcha.textproducer.font.size">25</prop> <!-- 验证码所属字体样式 --> <prop key="kaptcha.textproducer.font.names">楷体</prop> <!-- 干扰线颜色 --> <prop key="kaptcha.noise.color">black</prop> <!-- 验证码文本字符间距 --> <prop key="kaptcha.textproducer.char.space">8</prop> <!-- 图片样式 :水纹--> <prop key="kaptcha.obscurificator.impl">com.google.code.kaptcha.impl.Shadow</prop> </props> </constructor-arg> </bean> </property> </bean>
具体的参数信息(参考其他网站的):
Constant | 描述 | 默认值 |
---|---|---|
kaptcha.border | 图片边框,合法值:yes , no | yes |
kaptcha.border.color | 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. | black |
kaptcha.border.thickness | 边框厚度,合法值:>0 | 1 |
kaptcha.image.width | 图片宽 | 200 |
kaptcha.image.height | 图片高 | 50 |
kaptcha.producer.impl | 图片实现类 | com.google.code.kaptcha.impl.DefaultKaptcha |
kaptcha.textproducer.impl | 文本实现类 | com.google.code.kaptcha.text.impl.DefaultTextCreator |
kaptcha.textproducer.char.string | 文本集合,验证码值从此集合中获取 | abcde2345678gfynmnpwx |
kaptcha.textproducer.char.length | 验证码长度 | 5 |
kaptcha.textproducer.font.names | 字体 Arial, | Courier |
kaptcha.textproducer.font.size | 字体大小 | 40px. |
kaptcha.textproducer.font.color | 字体颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.textproducer.char.space | 文字间隔 | 2 |
kaptcha.noise.impl | 干扰实现类 | com.google.code.kaptcha.impl.DefaultNoise |
kaptcha.noise.color | 干扰颜色,合法值: r,g,b 或者 white,black,blue. | black |
kaptcha.obscurificator.impl | 图片样式: | 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy com.google.code.kaptcha.impl.WaterRipple |
kaptcha.background.impl | 背景实现类 | com.google.code.kaptcha.impl.DefaultBackground |
kaptcha.background.clear.from | 背景颜色渐变,开始颜色 | light grey |
kaptcha.background.clear.to | 背景颜色渐变,结束颜色 | white |
kaptcha.word.impl | 文字渲染器 | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
kaptcha.session.key | session key | KAPTCHA_SESSION_KEY |
kaptcha.session.date | session date | KAPTCHA_SESSION_DATE |
五、在Controller中对kaptcher做出配置
//导入kaptcha实现得到验证码功能 private Producer kaptchaProducer = null; @Autowired public void setCaptchaProducer(Producer kaptchaProducer) { this.kaptchaProducer = kaptchaProducer; }
@RequestMapping(value="/login",method=RequestMethod.POST) public String login(UserInfo u,Model model,HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException{ //获取设置好的验证码和待验证的验证码,如果验证成功就进行数据的操作,如果不对就直接刷新页面 String kaptchaCheck = (String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); String kaptchaReceive = (String) request.getParameter("user_input_verifyCode"); if(kaptchaCheck!=null&&(kaptchaCheck.toUpperCase()).equals(kaptchaReceive.toUpperCase())) { List<UserInfo> list = userInfoService.listUser(); for(UserInfo user:list) { if(u.getUserName().equals(user.getUserName())&&u.getPassword().equals(user.getPassword())) { model.addAttribute("user",user); if(request.getParameter("check")!=null) addCookie(u.getUserName(), u.getPassword(), response, request); return "index"; } } } return "login"; }
/** * 利用Kaptcha插件来生成验证码 * @param request * @param response * @return */ @RequestMapping("/kaptcha") public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response){ //生成验证码的方法 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"); response.setContentType("image/jpeg"); String capText = kaptchaProducer.createText(); request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText); BufferedImage bi = kaptchaProducer.createImage(capText); ServletOutputStream out = null; try { out = response.getOutputStream(); ImageIO.write(bi, "jpg", out); } catch (IOException e) { e.printStackTrace(); } try { out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }
效果: