1.pom.xml中添加Cage依赖。

    <dependency>
<groupId>com.github.cage</groupId>
<artifactId>cage</artifactId>
<version>1.0</version>
</dependency>

项目相关资料:https://akiraly.github.io/cage/quickstart.html 。

2.Controller:@RestController


@RestController
@RequestMapping("captcha")
public class CaptchaController { @Autowired
private CaptchaService captchaService; @RequestMapping("get")
public void get(HttpServletResponse response,String key) throws IOException {
response.setContentType("image/jpeg");//设置响应的媒体类型,这样浏览器会识别出响应的是图片
response.getOutputStream().write(captchaService.getCaptcha(key));
response.flushBuffer();
}
}

3.Service:

@Service("captchaService")
public class CaptchaService { private static final Logger log = LoggerFactory.getLogger(CaptchaService.class); @Autowired
RedisDao redisDao;
Cage cage = new GCage(); public byte[] getCaptcha(String id) {
if (StringUtils.isBlank(id)) {
return null;
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
String token = cage.getTokenGenerator().next().substring(0, 4);
try {
cage.draw(token, os);
os.close();
} catch (IOException e) {
e.printStackTrace();
}
String key = "captcha-" + id;
redisDao.getJredis().opsForValue().set(key, token);
redisDao.getJredis().expire(key, 1, TimeUnit.HOURS);
return os.toByteArray();
} public boolean matchCaptcha(String id, String captcha) {
if (StringUtils.isBlank(id) || StringUtils.isBlank(captcha)) {
return false;
}
String key = "captcha-" + id;
String redisCaptcha = String.valueOf(redisDao.getJredis().opsForValue().get(key));
if (StringUtils.isBlank(redisCaptcha)) {
return false;
}
log.info(id + ", " + captcha + ", " + redisCaptcha);
return StringUtils.equalsIgnoreCase(captcha, redisCaptcha);
}
}

4.前端页面:

$('#yzmimg').attr('src','https://localhost:8082/captcha/get?key'+timestamp);

总结:设置

response.setContentType("image/jpeg"),这样返回时将会以图片形式,此处为坑。

Spring中整合Cage,实现验证码功能的更多相关文章

  1. spring中整合memcached,以及创建memcache的put和get方法

    spring中整合memcached,以及创建memcache的put和get方法: 1:在项目中导入memcache相关的jar包 2:memcache在spring.xml的配置: 代码: < ...

  2. Spring中整合Titles

    在<Spriing实战(第三版)>这本书中,有一个使用titles的例子,但是这是一个不完整的例子.那么要参照起来就比较难了,于是找到了下面这篇博客. 在Spring中使用tiles2 ( ...

  3. 利用cglib包实现Spring中aop的<aop:advisor>功能

    一:前言 还有<aop:before>/<aop:after>/<aop:around>的没有实现,不过根<aop:advisor>是差不多的,就是要额 ...

  4. S2SH框架中的无刷新验证码功能实现

    暑假期间在实验室做使用S2SH框架的项目,其中登录和注册需要验证码,实现了一个没有实现刷新验证码功能的简单版本,代码如下: 1 package com.sem.action; 2 3 import j ...

  5. 玩转Spring MVC(五)----在spring中整合log4j

    在前边的基础上,本文主要总结一下如何在spring 中配置log4j,在本文末尾会给出完整项目的链接. 首先是web.xml中要新添加的代码: <!-- 6. 配置log4j --> &l ...

  6. SpringBoot学习:整合shiro(验证码功能和登录次数限制功能)

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)验证码 首先login.jsp里增加了获取验证码图片的标签: <body s ...

  7. spring中整合ssm框架注解版

    和xml版差不多,只不过创建对象的方式是由spring自动扫描包名,然后命名空间多一行context代码在application.xml中,然后将每个对象通过注解创建和注入: 直接上代码: 1.use ...

  8. SpringMVC整合kaptcha(验证码功能)

    一.依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha& ...

  9. SpringMVC 整合 kaptcha(验证码功能)

    一.添加依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptch ...

随机推荐

  1. UML开发工具Rose ralation的破解安装,

    UML开发工具Rose ralation的在windows764破解安装, 安装下载还可以参考:http://www.cnblogs.com/leaven/p/3718361.html 跟大家分享怎么 ...

  2. 新概念英语(1-111)The most expensive model

    Lesson 111 The most expensive model 最昂贵的型号 Listen to the tape then answer this question. Can Mr. Fri ...

  3. javascript学习(4)异常处理 try-catch 和 onerror

    一.try-catch 1.样例1 1.1.源代码 1.2.执行后 2.样例2 2.1.源代码 2.2.执行后 二.onerror 1.源代码 2.执行后

  4. Cookie、Session登陆验证相关介绍和用法

    一.Cookie和Session 首先.HTTP协议是无状态的:所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应直接影响,也不会直接 ...

  5. Python入门之函数的形式参数与实参/参数的具体使用方法

    本篇目录: 一. 函数参数之形式参数与实参 二. 函数参数的具体使用 #1.位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 #2.关键字参数:按照key=va ...

  6. Trensient的使用介绍

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  7. 阿里云下Linux服务器安装Mysql、mongodb

    阿里云下Linux服务器安装Mysql.mongodb 一.MySQL的安装和配置 1.安装rpm包 rpm -Uvh http://dev.mysql.com/get/mysql-community ...

  8. 改变textField的placeholder的颜色和位置

    重写UItextField的这个方法,用其他的textField继承自这个父类 - (void) drawPlaceholderInRect:(CGRect)rect { [[UIColor blue ...

  9. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal

    http://codeforces.com/contest/876/problem/A 题意: 一个人一天要吃n次蜂蜜,他有3个朋友,他第一次总是在一个固定的朋友家吃蜂蜜,如果说没有吃到n次,那么他就 ...

  10. 收藏:视频网站(JavaEE+FFmpeg)/Nginx+ffmpeg实现流媒体直播点播系统

    FFmpeg安装(windows环境)http://www.cnblogs.com/xiezhidong/p/6924775.html 最简单的视频网站(JavaEE+FFmpeg)http://bl ...