Java Web项目使用图形验证码 — Kaptcha
一、验证码介绍
生成的主要方式:
1.使用Java原生的方式,其中包含了Servlet、AWT、ImageIO的使用;
2.使用开源库,例如Jcaptcha、Kaptcha...;
(各图形验证码开源库:http://www.oschina.net/project/tag/248/captcha?lang=19)
另外,生成code可以保存在Session或Cookie,也可以保存在缓存(例如,Redis);
需要验证的时候,需要把从Session或者缓存中取出并与请求的验证码进行校验;
二、项目中使用验证码
项目中使用的是Google的开源库 - Kaptcha;注意:本项目使用了Spring MVC;
1.引入Maven
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
2.Spring配置Bean
更多Kaptcha配置请移步底部资料;
<!--图形验证码-->
<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
<property name="config">
<bean class="com.google.code.kaptcha.util.Config">
<constructor-arg type="java.util.Properties">
<value>
kaptcha.border=yes
</value>
</constructor-arg>
</bean>
</property>
</bean>
3.Controller中代码实现
@RestController
@RequestMapping(value = "/verify", name = "图片验证码")
public class ValidateCoderController {
private Logger logger = LoggerFactory.getLogger(ValidateCoderController.class);
@Autowired
private Producer captchaProducer;
@RequestMapping(value = "/code", method = RequestMethod.GET, name = "图片验证码")
public void code(HttpServletResponse response,
@RequestParam(value = "mobilePhone", required = true) String mobilePhone,
@RequestParam(value = "captchaType", required = true) Integer captchaType) {
if (!StrUtils.isPhoneNumber(mobilePhone)) {
return;
}
CaptchaType type = getCaptchaTypeByCode(captchaType);
if (isTooOften(mobilePhone, type.getValue())) {
logger.info("号码{}获取{}图片验证码频繁", mobilePhone, type.getBundleKey());
return;
}
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");
try (ServletOutputStream out = response.getOutputStream()) {
String capText = captchaProducer.createText().substring(0, 4);
BufferedImage bi = captchaProducer.createImage(capText);
ImageIO.write(bi, "jpg", out);
//设置验证码
RedisConnector.save(mobilePhone, capText, type.getValue());
/*移动端需要base64处理后返回,然后response的Headers不用配置;
此处需要使用ByteArrayOutputStream
BASE64Encoder encoder = new BASE64Encoder();
String base64String = encoder.encode(out.toByteArray());
*/
} catch (IOException e) {
e.printStackTrace();
logger.error("号码{}获取{}图片验证码失败", mobilePhone, type.getBundleKey());
}
}
private boolean isTooOften(String mobilePhone, String loginPre) {
String key = KeyUtils.getLimitKey(mobilePhone, loginPre);
if (RedisConnector.exists(key)) {
String countStr = RedisConnector.getData(key);
int count = Integer.parseInt(countStr);
if (count >= 30) {
return true;
}
}
return false;
}
}
4.验证码校验
需要使用的地方从Redis取出校验,这里需要注意的是:
1)Redis的Keys的生成工具类KeysUtils;
2)操作Redis的工具,以及Code的有效时间;
3)校验验证码成功需要使其失效;
Java原生方式:
http://tedhacker.top/2016/11/07/Java%E7%94%9F%E6%88%90%E9%AA%8C%E8%AF%81%E7%A0%81%E7%AE%80%E8%AE%B0/
https://www.jianshu.com/p/05409731abb8
使用Kaptcha:
https://www.jianshu.com/p/3a695783c5c1
http://blog.csdn.net/rambo_china/article/details/7720181
Java Web项目使用图形验证码 — Kaptcha的更多相关文章
- JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)
[我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...
- Java web项目综合练习(Estore)
Java web项目综合练习(Estore) 复习day18: ajax代码的书写步骤 2)json格式文本,转js对象的方法是那个 项目开发流程介绍 这里学习的JavaWEB项目实战,主要是把前面学 ...
- Java Web系列:Java Web 项目基础
1.Java Web 模块结构 JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class.Java Web和ASP.NET的核心是分别是Servlet和IHttpHandle ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
- 怎么将java web 项目导入idea 中
1.将 java web 项目导 入idea 中, 显示 然后进行 Configure 配置. 2. 点击 open module settings. 3. 4. 选择jar包. 5. 6. 配置to ...
- 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目
前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...
- Java Web项目报错java.lang.NullPointerException at org.apache.jsp.front.index_jsp._jspInit(index_jsp.java:30)
环境:myeclipse+tomcat6+jdk6 今天搭建了一个Java Web项目,访问index.jsp时报如下错误: 严重: Servlet.service() for servlet jsp ...
- 使用Spring Boot来加速Java web项目的开发
我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...
- Linux(Centos)之安装tomcat并且部署Java Web项目
1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图: b ...
随机推荐
- H5是什么?
找工作面试官都会问你H5吗? 然后做一个前端的我一脸蒙蔽,到底什么是H5? 一般来说刚开始H5 是 Html5标准的简称,但是仅仅是html5标签,几乎什么也做不出来了,最多就是个静态网页,还得用到j ...
- Python3 三元表达式、列表推导式、生成器表达式
Python3 三元表达式.列表推导式.生成器表达式 三元表达式 表达式中,有三个元素 name = input("请输入姓名: ")ret = '输入正确' if name == ...
- 【bzoj1927】[Sdoi2010]星际竞速
题目描述: 10 年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一. 赛车大赛的赛场由 N 颗行星和M条双向星际 ...
- warp(图像仿射变换)
仿射变换是一种二维坐标(x,y)到二维坐标(u,v)的线性变换. 对应的齐次坐标矩阵表示形式为: 仿射变换特点: 直线经仿射变换后依然为直线: ’直线之间的相对位置关系保持不变,平行线经仿射变换后依然 ...
- RedisTemplate访问Redis数据结构(前言)
Redis五种基本数据结构 redis提供键值对的形式对数据进行存储.支持五种数据类型:String(字符串),List(链表),Hash(散列),Set(无序集合),ZSet(有序集合).下面是网上 ...
- linux 搭建环境
报错:cannot find valid baseurl for repo:base 解决办法: https://blog.csdn.net/banqgg/article/details/782560 ...
- jsp页面a标签URL转码问题
简单的办法只有一句话,在后台对传过来的字符串(value)加一句: String value = new String(value.getBytes("ISO-8859-1"),& ...
- Xcode磁盘空间清理
http://www.iwangke.me/2013/09/09/clean-xcode-to-free-up-disk-space/#jtss-tsina 这个目录下面的文件也可以隔一段儿时间清理一 ...
- oracle 如何更改密码的hash
如何迁移oracle user的密码到新的环境,一下列出了方法: select name,spare4||';'||password pwd from sys.user$ where name = ' ...
- 玩转visual studio系列之类设计图
类设计图 vs 类设计图 微软 安装好vs2017后,在打开的IDE中,随便选择一个文件夹创建[类图],却发现没有该选项 类图辅助器 解决方案 1.点击[工具]选项卡,在下拉的菜单中选择第一项 获取 ...