当前位置: 首页 > news >正文

Day14-Servlet后端验证码的实现

图片验证码的生成采用的是Kaptcha

Kaptcha是一个高度可配置的验证码生成工具,由Google开源。它通过一系列配置文件和插件,实现了将验证码字符串自动转换成图片流,并可以与session进行关联,从而在验证过程中使用;

具体实现步骤如下:

第一步:添加依赖

        <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>

 第二步:配置验证码工具类

@WebServlet("/KaptchaCode")
public class Kaptcha extends HttpServlet {private Producer producer;@Overridepublic void init() {Properties properties = new Properties();//设置图片边框properties.setProperty("kaptcha.border", "yes");//设置图片边框为蓝色properties.setProperty("kaptcha.border.color", "blue");//背景颜色渐变开始properties.put("kaptcha.background.clear.from", "127,255,212");//背景颜色渐变结束properties.put("kaptcha.background.clear.to", "240,255,255");// 字体颜色properties.put("kaptcha.textproducer.font.color", "black");// 文字间隔properties.put("kaptcha.textproducer.char.space", "10");//如果需要去掉干扰线properties.put("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");// 字体properties.put("kaptcha.textproducer.font.names", "Arial,Courier,cmr10,宋体,楷体,微软雅黑");// 图片宽度properties.setProperty("kaptcha.image.width", "200");// 图片高度properties.setProperty("kaptcha.image.height", "50");// 从哪些字符中产生properties.setProperty("kaptcha.textproducer.char.string", "0123456789abcdefghijklmnopqrsduvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");// 字符个数properties.setProperty("kaptcha.textproducer.char.length", "4");Config config = new Config(properties);producer = config.getProducerImpl();}
//这里要注意了这个验证码生成只支持get方法@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 生成一个文本验证码String code = producer.createText();// 根据验证码文本生成一张图片BufferedImage image = producer.createImage(code);// 设置响应的内容类型为图片格式resp.setContentType("image/jpeg");// 将图片写入到响应的输出流中,以jpg格式保存ImageIO.write(image, "jpg", resp.getOutputStream());//session是给登录验证的逻辑代码传参的HttpSession session = req.getSession();session.setAttribute("code", code);}
}

第三步:前端/后端渲染代码引入 

<%--Created by IntelliJ IDEA.User: 21222Date: 2024/7/29Time: 上午10:35To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>学生信息管理系统登录页</title>
<%--   这里的样式代码放在文章末尾了太占位置了--%>
</head>
<body>
<div class="box"><h1>学生信息管理系统登录页</h1><form action="/javaweb/Login" method="post"><div class="form-group"><label for="user">账号</label><input type="text" id="user" name="user" placeholder="请输入账号"></div><div class="form-group"><label for="pw">密码</label><input type="text" id="pw" name="pw" placeholder="请输入密码"></div><div class="captcha-container"><div class="form-group"><label for="yzm">验证码</label><input type="text" id="yzm" name="yzm" placeholder="请输入验证码"></div>
<%--            验证码的引入--%><img src="/javaweb/KaptchaCode" alt="验证码" width="120" onclick="this.src=this.src+'?'+Math.random()"></div><button type="submit">登录</button></form>
</div>
</body>
</html>

css样式代码 

<style>body {font-family: Arial, sans-serif;background-color: #f7f7f7;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.box {width: 360px;background-color: #fff;border-radius: 10px;padding: 30px;box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);display: flex;flex-direction: column;align-items: center;}h1 {font-size: 26px;margin-bottom: 20px;color: #333;text-align: center;}form {width: 100%;}.form-group {margin-bottom: 20px;display: flex;flex-direction: column;}.form-group label {margin-bottom: 5px;font-size: 14px;color: #555;}.form-group input[type="text"] {padding: 10px;border: 1px solid #ddd;border-radius: 5px;box-sizing: border-box;width: 100%;}.form-group input[type="text"]:focus {border-color: #4CAF50;outline: none;}.captcha-container {display: flex;align-items: center;margin-bottom: 20px;}.captcha-container img {margin-left: 10px;cursor: pointer;border-radius: 5px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);}button {background-color: #4CAF50;color: white;padding: 12px 20px;border: none;border-radius: 5px;cursor: pointer;font-size: 16px;transition: background-color 0.3s ease;width: 100%;}button:hover {background-color: #45a049;}</style>

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WildCard虚拟卡绑定openAI付款方式
  • 从信息论的角度看微博推荐算法
  • 【网络安全】大小写绕过速率限制
  • FastAPI().post(“/retrieve“)在postman中发送请求和接受响应
  • TypeScript 定义不同的类型(详细示例)
  • 【全志H616开发】SQLite打开/创建数据库的C接口
  • 一款功能强大的免费开源卸载工具
  • 基于N32L406MB EasyFlash参数(key-value)记录库移植
  • 设计模式-策略模式的完整代码示例及测试验证
  • 【Python】期权--隐含波动率计算
  • 手把手构建Netty
  • 【前端 · 面试 】TCP 总结(一)—— 概述
  • SpringCloud Alibaba 微服务(四):Sentinel
  • Web前端:HTML篇(一)
  • ubuntu修改anaconda权限
  • hexo+github搭建个人博客
  • Bootstrap JS插件Alert源码分析
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • FastReport在线报表设计器工作原理
  • js如何打印object对象
  • Objective-C 中关联引用的概念
  • python docx文档转html页面
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React Native移动开发实战-3-实现页面间的数据传递
  • React16时代,该用什么姿势写 React ?
  • vue2.0项目引入element-ui
  • Vue--数据传输
  • 笨办法学C 练习34:动态数组
  • 关于字符编码你应该知道的事情
  • 回顾 Swift 多平台移植进度 #2
  • 每天一个设计模式之命令模式
  • 盘点那些不知名却常用的 Git 操作
  • 用 Swift 编写面向协议的视图
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • HanLP分词命名实体提取详解
  • kubernetes资源对象--ingress
  • 积累各种好的链接
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Java入门)抽象类,接口,内部类
  • (pojstep1.3.1)1017(构造法模拟)
  • (Python) SOAP Web Service (HTTP POST)
  • (SERIES12)DM性能优化
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)Linux整合apache和tomcat构建Web服务器
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 6 集成和使用 mongodb
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core 中的路径问题
  • .NET Core中Emit的使用
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化