JavaWeb学习笔记——验证码

解决的问题

表单重复提交有三种常见的情况:

  1. 表单提交完成之后,服务器使用请求转发进行页面的跳转,此时,若用户按下 F5(刷新),浏览器会重新发起最后一次的请求,造成表单的重复提交。解决方法:使用请求重定向代替请求转发
  2. 用户正常提交表单,但由于网络延迟等原因,迟迟未收到服务器的响应,此时,用户误以为表单提交失败,重复点击提交按钮,造成表单重复提交。解决方法:使用验证码
  3. 用户正常提交表单,服务器也没有延迟,但提交完成后,用户回退浏览器页面(<- 按钮),再重新提交,也会造成表单重复
    提交。解决方法:使用验证码

kaptcha 的使用

实现

kaptcha 是谷歌提供的图片验证码,原理如下:

  1. 客户端访问验证码对应的 Servlet 程序,kaptcha 程序生成验证码,并将正确的验证码保存到 Session 域中,key 为:KAPTCHA_SESSION_KEY
  2. 接收客户端发送的验证码
  3. 取出 Session 域中的验证码,并 立即删除 Session 域中该验证码内容
  4. 比较两个验证码是否相同

每次访问验证码对应的 Servlet 程序后,kaptcha 会将正确验证码的内容保存到 Session 域中,当服务器接收客户端发送的验证码之后,

使用步骤如下:

  1. 导入谷歌 kaptcha 的 jar 包:kaptcha-2.3.2.jar
  2. 在 web.xml 中配置用于生成验证码的 Servlet 程序

在这里插入图片描述
上面的 KaptchaServlet.class 就是谷歌已经写好的用于生成验证码的 Servlet 程序,只需要在 web.xml 中配置该类的访问地址即可。

web.xml

  <!-- 配置谷歌验证码程序KaptchaServlet -->
  <servlet>
  	<servlet-name>KaptchaServlet</servlet-name>
  	<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="password" name="password" > <br>
	验证码:<input type="text" style="width: 80px;" name="code">
	<img id="code_img" src="http://localhost:8080/tmp/kaptcha.jpg" alt="" style="width: 100px; height: 28px;"> <br>
	<input type="submit" value="登录">
</form>
  1. 服务器端验证 Session 域中的验证码与客户端发来的验证码是否相同,并立即删除 Session 域中的验证码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	// 获取 Session 中的验证码
	String token = (String) req.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
	// 立即删除 Session 中的验证码
	req.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);
	String code = req.getParameter("code");
	// 获取用户名和密码
	String username = req.getParameter("username");
	String password = req.getParameter("password");
	if (token != null && token.equalsIgnoreCase(code)) {
		System.out.println("保存到数据库:" + username + ", " + password);
		resp.sendRedirect(req.getContextPath() + "/login_successful.jsp");
	} else {
		System.out.println("请不要重复提交表单");
	}
}

切换验证码

//为验证码图片绑定单击事件,使得每次点击验证码图片后都会刷新验证码
$("#code_img").click(function(){
	/*
	在事件响应的function函数中有一个this对象,这个this对象,就是当前正在响应事件的dom对象,
	这里表示img标签对象,src属性表示img标签的图片路径,它可读可写
	${ baseAddr }kaptcha.jpg  = http://localhost:8080/tmp/kaptcha.jpg
	浏览器缓存文件的名称由:资源名+参数 组成
	增加一个可变参数d,使得每次请求的名称不同,避免浏览器缓存验证码,导致验证码点击时不刷新的问题
	new Date().getTime()是JavaScript中提供的对象和方法
	*/
	this.src = "${ baseAddr }kaptcha.jpg?" + new Date().getTime();
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP(JavaServer Pages)是一种服务器端的动态网页开发技术,它可以将 Java 代码嵌入 HTML 页面,从而实现动态网页的生成。 JSP 的基本原理是将 JSP 页面翻译成 Servlet,在服务器端执行 Servlet 代码,再将执行结果返回给客户端。因此,我们在使用 JSP 开发网页时,需要先了解 Servlet 的相关知识。 JSP 的语法基本上就是 HTML 标签加上 Java 代码。以下是一些基本的 JSP 标签: 1. <% ... %>:嵌入 Java 代码,可以用于定义变量、写循环、判断语句等。 2. <%= ... %>:输出 Java 代码的执行结果。 3. <%-- ... --%>:注释,不会被翻译成 Servlet。 4. <jsp:include ... />:包含其他 JSP 页面或 HTML 页面。 5. <jsp:forward ... />:将请求转发到其他资源(JSP 页面、Servlet 或 HTML 页面)。 6. <jsp:useBean ... />:创建 JavaBean 对象。 7. <jsp:setProperty ... />:为 JavaBean 对象设置属性。 8. <jsp:getProperty ... />:取得 JavaBean 对象的属性值。 在 JSP 页面,我们还可以使用 EL 表达式和 JSTL 标签库来简化代码编写,提高开发效率。 EL(Expression Language)表达式是一种简化的表达式语言,可以用于取值、赋值、计算等操作。例如,${name} 表示取得名为 name 的变量的值。 JSTL(JavaServer Pages Standard Tag Library)是一套标签库,提供了循环、条件判断、格式化、国际化等常用功能的标签。例如,<c:forEach> 标签可以用于循环遍历集合,<c:if> 标签可以用于条件判断。 除了以上标签库,JSP 还支持自定义标签库。我们可以通过编写标签处理器来扩展 JSP 的功能。 JSP 的优点是可以将 Java 代码嵌入 HTML 页面,使得网页的开发更加灵活和方便。但是,由于 JSP 页面需要翻译成 Servlet,因此会增加服务器的负担和响应时间。此外,JSP 页面夹杂着 Java 代码,也不利于代码的维护和调试。因此,在开发大型网站时,建议使用 MVC 设计模式,将业务逻辑和视图分离,使得代码更加清晰和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值