前言
浏览器验证码可解决用户重复提交表单的问题。
内容: 获取随机验证码的图片、获取随机验证码的内容
语言: Java
项目: tomcat、Servlet
第一步:导包
下载并导入 kaptcha
jar包,下载链接
第二部:配置servlet
配置包中的 KaptchaServlet
Servlet程序,路径如图:
配置操作:在web.xml(web项目配置文件)中加入servlet配置
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>
<!-- 命名为 kaptcha.jpg 是为了便于区分,这些代码包含在web-app标签中 -->
第三步:使用
1.获取验证码图片
浏览器访问KaptchaServlet程序路径即可获取到验证码 每次刷新都有不同验证码
示例:
http://localhost:8080/book/kaptcha.jpg
【http://ip:port/工程名/KaptchaServlet程序】
图片示例:
2.取出验证码内容
通过session获取
在jar包的常量类中可以找到 KAPTCHA_SESSION_KEY
常量值,这个值对应 session 的一个 key 值,这个 session 的 value 值就是验证码内容
如图:
获取代码
/* req: HttpServletRequest req */
String token = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY); // value就是验证码内容
req.getSession().removeAttribute(KAPTCHA_SESSION_KEY); // 删了
问题及解决
刷新后验证码不变
问题浏览器:
firefox或ie
问题:
浏览器每次刷新都应该获取到不同的验证码,如果刷新后验证码不变,考虑是浏览器缓存问题。
原因:
浏览器为了加快响应速度,可能会保存上次的验证码,浏览器刷新后会就会定位到上次的验证码缓存。
解决:
让每个验证码的参数唯一,例如xcode?d=123
、xcode?d=32132
,这样浏览器就不会重复定位。
可以加个时间戳。
js代码实现参考示例:
this.src = "http://localhost:8080/book/kaptcha.jpg?d=" + new Date();
// this是img对象,src 指向 KaptchaServlet 程序。我们可以通过加时间戳来实现唯一参数