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 ...
随机推荐
- CSS3——制作正在加载页面loading...
今天做了好多小东西,还挺开心的~ <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- react native 之 AsyncStorage
新版本中不时从react-native导入了,而是 react-native-async-storage 使用static setItem(key: string, value: string, [c ...
- js+php大文件分片上传
1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...
- Internet History, Technology, and Security(week2)——History: The First Internet - NSFNet
前言: 上周学习了<电子计算机的曙光>,对战时及战后的计算机的历史发展有了更丰富的了解,今天继续coursera的课程,感觉已经有点适应了课程的节奏(除了经常有些奇奇怪怪的词汇看都看不懂@ ...
- [BZOJ3236]:[Ahoi2013]作业(莫队+分块)
题目传送门 题目描述 此时已是凌晨两点,刚刚做了$Codeforces$的小$A$掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可与做完的数学作业,接下来是分别都是一个小时可 ...
- 最新版本的MySQL的下载和安装(Release: 8.0.12)
1.打开百度搜索[Myql],或直达官网https://dev.mysql.com/ 2.点选[Download按钮],跳转到下载页面,拉到底部再点选[Community Download]社区版[免 ...
- Linux内核调试方法总结之栈帧
栈帧 栈帧和指针可以说是C语言的精髓.栈帧是一种特殊的数据结构,在C语言函数调用时,栈帧用来保存当前函数的父一级函数的栈底指针,当前函数的局部变量以及被调用函数返回后下一条汇编指令的地址.如下图所示: ...
- B-/B+树 MySQL索引结构
索引 索引的简介 简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构” 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁 ...
- node+express POST请求
// POST 登录 app.post('/login', function (req, res) { // 定义了一个post变量,用于暂存请求体的信息 let [post,addSql,addSq ...
- Ngix 配置与部署(wsgi,uwsgi,uWSGI)
1. WSGI 是一种协议接口,他是描述web服务器如何与web应用程序(Django ,Flask ) 通讯的规范. 2. uwsgi 与WSGI协议一样,是uWSGI服务器的独占协议,用于定义传输 ...