一、验证码介绍

生成的主要方式:

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的更多相关文章

  1. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  2. Java web项目综合练习(Estore)

    Java web项目综合练习(Estore) 复习day18: ajax代码的书写步骤 2)json格式文本,转js对象的方法是那个 项目开发流程介绍 这里学习的JavaWEB项目实战,主要是把前面学 ...

  3. Java Web系列:Java Web 项目基础

    1.Java Web 模块结构 JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class.Java Web和ASP.NET的核心是分别是Servlet和IHttpHandle ...

  4. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  5. 怎么将java web 项目导入idea 中

    1.将 java web 项目导 入idea 中, 显示 然后进行 Configure 配置. 2. 点击 open module settings. 3. 4. 选择jar包. 5. 6. 配置to ...

  6. 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目

    前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...

  7. 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 ...

  8. 使用Spring Boot来加速Java web项目的开发

    我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...

  9. Linux(Centos)之安装tomcat并且部署Java Web项目

    1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图:          b ...

随机推荐

  1. 【开车旅行】题解(NOIP2012提高组)

    分析 首先我们可以发现,两个询问都可以通过一个子程序来求. 接着,如果每到一个城市再找下一个城市,显然是行不通的.所以首先先预处理从每一个城市开始,小A和小B要去的城市.预处理的方法很多,我用的是双向 ...

  2. 【leetcode】1170. Compare Strings by Frequency of the Smallest Character

    题目如下: Let's define a function f(s) over a non-empty string s, which calculates the frequency of the ...

  3. 对postcss-plugin-px2rem的研究

    1.安装postcss-plugin-px2rem 2.配置 css: { loaderOptions: { postcss: { plugins: [ require('postcss-plugin ...

  4. Flink Forward Asia 2019 - 总结和展望(附PPT下载链接)

    11 月 28 - 30 日,北京迎来了入冬以来的第一场雪,2019 Flink Forward Asia(FFA)也在初雪的召唤下顺利拉开帷幕.尽管天气寒冷,FFA 实际到会人次超过 2000,同比 ...

  5. 超赞的Linux软件分享(持续更新)

    开发 Android studio - Android 的官方 IDE:Android Studio 提供在各种类型的安卓设备上构建应用最快的工具. Aptana - Aptana Studio 利用 ...

  6. php end()函数 语法

    php end()函数 语法 作用:将数组内部指针指向最后一个元素,并返回该元素的值(如果成功).博智达 语法:end(array) 参数: 参数 描述 array 必需.规定要使用的数组. 说明:如 ...

  7. Maven的settings.xml配置详解

    子节点详细介绍转载:http://www.cnblogs.com/jingmoxukong/p/6050172.html?utm_source=gold_browser_extension 全局配置 ...

  8. MacOS上zsh环境设置默认jdk

    进入home目录 cd ~ 修改.zprofile文件 vi .zprofile 按i进入vim插入模式,添加以下代码 export JAVA_HOME="/Library/Java/Jav ...

  9. ORACLE权限管理—创建只读账号

    创建只读用户:grant connect to user; grant create session to user; 1.创建角色 CREATE ROLE SELECT_ROLE 2.给角色分配权限 ...

  10. 用vuex实现购物车功能

    效果图 展示目录结构 product组件(纯静态代码) cart组件(纯静态代码) info组件(纯静态代码) 完成以上的三个组件,现在要开始调用这些组件,在App.vue中调用 如果你的姿势正确的话 ...