今天我们讲一下在 Java 中验证码的使用。
验证码生成
本效果是利用easy-captcha工具包实现,首先需要添加相关依赖到pom.xml中,代码如下:
< dependency >
< groupId >com.github.whvcse< /groupId >
< artifactId >easy-captcha< /artifactId >
< version >1.6.2< /version >
< /dependency >
验证码格式
easy-captcha验证码工具支持GIF、中文、算术等类型,分别通过下面几个实例对象实现:
- SpecCaptcha(PNG类型的静态图片验证码)
- GifCaptcha(Gif类型的图片验证码)
- ChineseCaptcha(GIF类型中文图片验证码)
- ArithmeticCaptcha(算术类型的图片验证码)
字符类型分为以下几种:
- TYPE_DEFAULT:数字和字母混合
- TYPEONLYNUMBER:纯数字
- TYPEONLYCHAR:纯字母
- TYPEONLYUPPER:纯大写字母
- TYPEONLYLOWER:纯小写字母
- TYPENUMAND_UPPER:数字和大写字母混合
后端逻辑的实现
package com.yanx.controller;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class KapchaController {
@GetMapping("/kaptcha")
public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.setHeader("Cache-Control","no-store");
httpServletResponse.setHeader("Pragma","no-cache");
httpServletResponse.setDateHeader("Expires",0);
httpServletResponse.setContentType("image/gif");
//三个参数分别为宽、高、位数
SpecCaptcha captcha=new SpecCaptcha(75,30,4);
//设置类型为数字和字母混合
captcha.setCharType(Captcha.TYPE_DEFAULT);
//设置字体
captcha.setCharType(Captcha.FONT_9);
//验证码存入session
httpServletRequest.getSession().setAttribute("verifyCode",captcha.text().toLowerCase());
//输出图片流
captcha.out(httpServletResponse.getOutputStream());
}
}
这里控制器新增了defaultKaptcha()方法,该方法所拦截处理的路径为/kaptcha
前端逻辑的实现
在static目录中新建kaptcha.html页面,代码如下:
< !DOCTYPE html >
< html lang="en" >
< head >
< meta charset="UTF-8" >
< title >验证码< /title >
< /head >
< body >
< img src="/kaptcha" onclick="this.src='/kaptcha?t=new Date()'" >
< /body >
< /html >
访问后端验证码路径/kaptcha,验证码为图片形式。onclick方法为点击该标签时可以动态切换显示验证码。
启动Spring Boot项目,打开浏览器输入地址:
http://localhost:8080/kaptcha.html
效果如下:
验证码验证
后端代码
package com.yanx.controller;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@Controller
public class KapchaController {
@GetMapping("/kaptcha")
public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.setHeader("Cache-Control","no-store");
httpServletResponse.setHeader("Pragma","no-cache");
httpServletResponse.setDateHeader("Expires",0);
httpServletResponse.setContentType("image/gif");
//三个参数分别为宽、高、位数
SpecCaptcha captcha=new SpecCaptcha(75,30,4);
//设置类型为数字和字母混合
captcha.setCharType(Captcha.TYPE_DEFAULT);
//设置字体
captcha.setCharType(Captcha.FONT_9);
//验证码存入session
httpServletRequest.getSession().setAttribute("verifyCode",captcha.text().toLowerCase());
//输出图片流
captcha.out(httpServletResponse.getOutputStream());
}
@GetMapping("/verify")
@ResponseBody
public String verify(@RequestParam("code") String code, HttpSession session){
if(StringUtils.isEmpty(code)){
return "验证码不能为空";
}
String kapchaCode = session.getAttribute("verifyCode")+"";
if(StringUtils.isEmpty(kapchaCode)||!code.toLowerCase().equals(kapchaCode)){
return "验证码输入错误";
}
return "验证成功";
}
}
前端代码
< !DOCTYPE html >
< html lang="en" >
< head >
< meta charset="UTF-8" >
< title >验证码验证< /title >
< /head >
< body >
< img src="/kaptcha" onclick="this.src='/kaptcha?d=new Date()'" >
< br >
< input type="text" maxlength="5" id="code" placeholder="请输入验证码"/ >
< button id="verify" >验证< /button >
< br/ >
< p id="verifyResult" >< /p >
< /body >
< script src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js" >< /script >
< script type="text/javascript" >
$(function(){
//验证按钮点击事件
$('#verify').click(function(){
var code=$('#code').val();
$.ajax({
type:'GET',//方法类型
url:'/verify?code='+code,
success:function(result){
$('#verifyResult').html(result);
},
error:function(){
alert('请求失败');
},
});
});
});
< /script >
< /html >
效果
结束语
生成验证码功能还是比较常用的,所以记录整理一下,方便以后回顾,如果有帮到你们的地方倍感荣幸,有路过的大佬还望不吝雅教!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
JAVA
+关注
关注
19文章
2904浏览量
102994 -
浏览器
+关注
关注
1文章
974浏览量
34418 -
代码
+关注
关注
30文章
4555浏览量
66768 -
验证码
+关注
关注
2文章
20浏览量
4344
发布评论请先 登录
相关推荐
鸿蒙原生应用/元服务开发-Serverless账户验证码的问题
在应用/元服务早期使用过程中,-Serverless账户验证码的格式是[AGC][应用/元服务名称],如下图。
但是,在最近,[应用/元服务]名称直接变成了【default】,用户收到这种验证码后,心里存有疑虑的,这是哪里配置或
发表于 12-27 15:55
织梦dedecms登陆提示“验证码不正确”的完整解决方案
很多朋友碰到了网站登陆的时候遇到了验证码不正确,考虑到刚刚设置了网站文件夹的权限,估计是权限不够造成的,后来经过了解,dedecms的验证码是data目录的session文件夹,在服务器上把
发表于 03-10 23:53
10种意想不到的验证码风格设计
simpleCaptcha玩具验证码,选一个吧。7. slideLock拖动滚动条来解锁吧。8. Captcha PHP动画验证码。9. NuCaptcha输入flash视频中的红字母就对了。10.
发表于 05-05 14:03
12306图片验证码难倒了谁?
``近日,朋友圈多出现抢票验证码的刷屏,多地多方向的春运火车票进入“秒杀”状态,根据最长60天的预售期,12月10日(本周四)将开售除夕火车票,归家的游子将面临售票高峰。然而,要想“秒杀”到一张车票
发表于 12-08 10:29
为什么短信验证码在我们生活中频频出现
随着时代的进步和科学技术的发展,越来越多的企业已经离不开短信验证码发送平台了,因为它可以帮助企业处理大量的用户信息,提高接收短信验证码的经验意识。大型网站提供了短信验证码功能,更准确、更安全地保证了
发表于 04-16 23:12
一文解析验证码与打码平台的攻防对抗
1、验证码与打码平台的攻防对抗 众所周知,验证码的出现是为了区分人和机器,但随着科技的发展,黑产从业者的可图之利增多,验证码的战场也进入了一段破解与抗破解的持久博弈。
发表于 09-28 11:02
java图形验证码生成的设计实现
;/Kaptcha</url-pattern></servlet-mapping>html中添加验证码标签,并绑定javascript事件:<
发表于 10-21 14:42
打码平台是如何高效的破解市面上各家验证码平台的各种形式验证码的?
点选类验证码。所以机器破解的主要方向是通过识别图片中的相关验证要素来进行破解,例如识别滑动验证码的缺口,点选验证码中的文字要素和数字要素,其
发表于 11-01 15:21
RT-Thread studio sdk manager下载镜像为何没有图形验证码?
rt-thread studio sdk manager下载镜像为何没有图形验证码?正常从gitee下载代码会进行图形验证但是为何在Rt-thread Studio中下载却没有提示验证,这是用什么技术实现的
发表于 02-15 10:23
【国民技术N32项目移植】手机验证码项目移植4--手机验证码计算
,再从device_id中取一位,一共6位作为验证码。TOTP算法依赖以下参数:device_id:设备id,实际项目中跟设备绑定,由服务器下发。t_utc:当前网络时间,是UTC时间,不是北京时间
发表于 02-24 14:45
以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别
很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。本文以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别。
评论