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

谷歌验证码的使用

1. 表单重复提交之验证码

1.1 表单重复提交三种常见情况

  1. 提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起最后一次的请求。造成表单重复提交问题。解决方法:使用重定向来进行跳转
  2. 用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,就会着急,然后多点了几次提交操作,也会造成表单重复提交。
  3. 用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交。也会造成表单重复提交
    在这里插入图片描述

2. 谷歌kaptcha图片验证码的使用

2.1使用步骤

  1. 导入谷歌验证码的jar包
    • kaptcha-2.3.2.jar
  2. 在web.xml中去配置用于生成验证码的Servlet程序
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<!-->com.google.code.kaptcha.servlet.KaptchaServlet,是jar包提供的-->
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>
  1. 在表单中使用 img 标签去显示验证码图片并使用它
<form action="http://localhost:8080/tmp/registServlet" method="get">
用户名:<input type="text" name="username" > <br>
验证码:<input type="text" style="width: 80px;" name="code">
<img src="http://localhost:8080/tmp/kaptcha.jpg" alt="" style="width: 100px; height: 28px;"> <br>
<input type="submit" value="登录">
</form>
  1. 在服务器获取谷歌生成的验证码和客户端发送过来的验证码比较使用。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 获取 Session 中的验证码
String token = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);
// 删除 Session 中的验证码
req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
String code = req.getParameter("code");
// 获取用户名
String username = req.getParameter("username");
if (token != null && token.equalsIgnoreCase(code)) {
System.out.println("保存到数据库:" + username);
resp.sendRedirect(req.getContextPath() + "/ok.jsp");
} else {
System.out.println("请不要重复提交表单");
}
}
  1. 切换验证码
    在这里插入图片描述
// 给验证码的图片,绑定单击事件
$("#code_img").click(function () {
// 在事件响应的 function 函数中有一个 this 对象。这个 this 对象,是当前正在响应事件的 dom 对象
// src 属性表示验证码 img 标签的 图片路径。它可读,可写
// alert(this.src);
//因为浏览器缓存的问题,所以后面都需要有一个不同的值。
this.src = "${basePath}kaptcha.jpg?d=" + new Date();
});

3. kaptcha详细参数

在这里插入图片描述

http://www.lryc.cn/news/28541.html

相关文章:

  • Git学习入门(1)- git的安装与配置
  • 【Python】使用Playwright断言方法验证网页和Web应用程序状态
  • libgdx导入blender模型
  • 【20230227】回溯算法小结
  • centos安装rocketmq
  • 汇编语言程序设计(二)之寄存器
  • 华为OD机试Golang解题 - 单词接龙 | 独家
  • Elasticsearch的搜索命令
  • 为什么人们宁可用Lombok,也不把成员设为public?
  • 【Redis】Redis 如何实现分布式锁
  • C++ 断言
  • C++修炼之练气期第五层——引用
  • 从企业数字化发展的四个阶段,看数字化创新战略
  • vulnhub five86-1
  • 28个案例问题分析---01---redis没有及时更新问题--Redis
  • [1.3_3]计算机系统概述——系统调用
  • Vue基础学习 第一个Vue程序 el挂载点 v-指令(1)
  • 前端页面性能
  • 2023-03-04 反思
  • 奇思妙想:超链接唤起本地应用
  • 初识数据结构——“数据结构与算法”
  • 华为OD机试Golang解题 - 计算网络信号
  • ESP32编译及运行错误记录
  • GEE开发之降雨(CHIRPS)数据获取和分析
  • TypeScript中面向对象
  • Transformer 模型:入门详解(1)
  • 深入理解js中的new关键字
  • RT-Thread Nano(2) - 线程
  • 真香,Grafana开源Loki日志系统取代ELK?
  • 机器学习|多变量线性回归 | 吴恩达学习笔记