背景
由于网络安全问题威胁很大,不时有网警做端口扫描预警通知(建议改造的通知文件),迫于种种的网络安全压力,写这个后端生成工具。
支持两种方式:
1.英文模式
2.算数模式
源码文件
依赖包
1.commons-collections-3.2.jar
2.commons-logging-1.0.4.jar
3.jcaptcha-all-1.0-RC6.jar(核心包)
实现方式
前端
获取验证码图片的源码如下
//验证码图片点击事件,从后端获取验证码图片
$("#system-data-els-upload").off("click",".photho-img").on("click",".photho-img",function(){
var $Image=$(this);
var xhr = new XMLHttpRequest();
xhr.open('GET', '../sso/getValidCode.do', true);
xhr.responseType = 'blob'; // 指定响应类型为二进制数据
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200)
{
var imageDataURL = URL.createObjectURL(xhr.response);
// 将图片DataURL设置为img标签的src属性
$Image.attr('src', imageDataURL);
}
};
xhr.setRequestHeader('Cache-Control', 'no-store');
xhr.setRequestHeader('Pragma', 'no-cache');
xhr.setRequestHeader('Expires', '0');
xhr.send();
});
后端
控制层
/**
* 获取验证码
* @Author 朱腾
* @Time 2023年7月29日
*/
@RequestMapping("/sso/getValidCode")
public void getValidCode(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response)
{
try
{
String sessionid = request.getSession().getId();
//获取验证码服务
ImageCaptchaService service = ValidCodeUtil.getService(sessionid);
//添加干扰线
BufferedImage image = service.getImageChallengeForID(sessionid, request.getLocale());
ValidCodeUtil.addImageLine(image);
//将图片返回到客户端
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0L);
response.setContentType("image/jpeg");
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", jpegOutputStream);
byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
ServletOutputStream respOs = response.getOutputStream();
respOs.write(captchaChallengeAsJpeg);
respOs.flush();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
验证
以下是用于验证用户输入的验证码
验证操作只能执行一次,执行后该验证码的管理器会被抛弃,再次验证返回false
if (StringUtils.isBlank(requestParams.getString("code")))
{
throw new Exception("验证码不可为空");
}
String sessionid = request.getSession().getId();
//执行验证
boolean status = ValidCodeUtil.validateCode(sessionid, requestParams.getString("code"));