JavaWeb 之 重复提交表单和验证码相关的问题!

    下面我们首先来说一下表单的重复提交问题,我们知道在真实的网络环境中可能受网速带宽的原因会造成页面中表单在提交的过程中出现网络的延迟等问题,从而造成多次提交的问题!下面我们就具体来分析一下造成表单提交的一些常见问题。

下面我们就来列举一下重复提交的情况:

  ① 、当表单提交数据到一个 Servlet 中,然后 Servlet再通过请求转发到成功页面,但是此时的地址栏中的地址是到 Servlet映射中的地址,并没有跳转到成功页面相关的JSP页面中,此时刷新页面会造成再一次提交表单。

  ② 、当在表单页面中点击提交按钮时,表单页面没有立即跳转到Servlet来进行处理(网络延迟),而此时用户就点击多次提交按钮,也会造成重复提交表单!

  ③ 、当用户进行表单数据提交成功后,又通过浏览器上的返回按钮返回到提交表单页面,(在不进行刷新到条件下)再次进行点击提交也会造成重复提交表单的情况!这是因为在不进行刷新的情况下页面的表单数据是浏览器第一次提交的缓存,故而进行提交的还是第一次提交的数据。而进行刷新后则是一个新的request请求!

对此我们如何进行防止表单的重复提交呢?下面我们来进行说一下:

    ①  . 我们提供一个隐藏域: <input type="hidden" name="token" value="vincent"/>.来进行作为标记。这时我们发现当我们将数据提交到Servlet中时,没有方法清除固定的请求参数(即:标记).所以该方案是行不通的!

    ②  . 把标记放在 request 中.这时虽然我们可以通过作用域的removeAttribute(str);方法将标记进行删除 但是当我们请求表单页面时虽然将标记保存到request中, 而我们点击提交按钮时,将会向Servlet重新提交一个新的request,而此时第一个request已经失去了它的作用域(我们知道request只能在一次请求之间有效!)被销毁掉,故而无法在目标Servlet中获取到第一request设置的属性(标记),所以该方案也行不通!

    ③. 把标记放在 session 中. 可以!同时我们也可以使用隐藏域来帮助我们将标记变成一个随机值。

   > 在原表单页面, 生成一个随机值 token

   String tokenValue = new Data().getTime() + “”;

    (使用时间来作为随机值,还不够随机,不过暂时对于我们学习而言还可以,切记在工作中使用时间来作为随机值,因为在大量的用户访问我们的产品时,时间就不能作为随机数了)

  > 在原表单页面, 把 token 值放入 session 属性中

   session.setAttribute(“token”,tokenValue);

  > 在原表单页面, 把 token 值放入到 隐藏域 中.

  <input type=”hidden” name=”token”value=<%=tokenValue%> />

   > 在目标的 Servlet 中: 获取 session 和 隐藏域 中的 token 值

  Object token =  request.getSession.getAttribute(“token”);

  String tokenValue = request.getParameter(“token”);

   > 比较两个值是否一致: 若一致, 受理请求, 且把 session 域中的 token 属性清除

  > 若不一致, 则直接响应提示页面: "重复提交"

    if( token != null && token.equals(tokenValue)){

    session.removeAttribute(“token”);

    }else{

    response.sendRedirect("repeated.jsp");//响应提示页面: "重复提交"

    }

    response.sendRedirect("success.jsp");

以上就可以解决表单重复提交的问题了!此外当我们在框架中如Struts1、Struts2、SpringMVC中也可以看到它们也提供了相应的解决方法!



下面我们来说一下,关于验证码的问题:

对于为什么要使用验证码的原因相信大家都知道在此就不在赘述了!其实对于验证码来说,和防止表单重复提交一样的原理一样。

> 在原表单页面, 生成一个验证码的图片, 生成图片的同时, 需要把该图片中的字符串放入到 session 中.

> 在原表单页面, 定义一个文本域, 用于输入验证码.

> 在目标的 Servlet 中: 获取 session 和 表单域 中的 验证码的 值

> 比较两个值是否一致: 若一致, 受理请求, 且把 session 域中的 验证码 属性清除

> 若不一致, 则直接通过重定向的方式返回原表单页面, 并提示用户 "验证码错误"

时间: 2024-10-31 12:47:55

JavaWeb 之 重复提交表单和验证码相关的问题!的相关文章

php防止用户重复提交表单

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 效果图: 那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手: 首先从前端做限制.前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效. 第二,我们可以在提交后做redirect页面重定向,

如何防止重复提交表单?

防止重复提交表单的方法有很多,包括数据库判断,js验证,cookies验证及session验证等,具体使用方法如下: 使用JS让按钮在点击一次后禁用(disable).采用这种方法可以防止多次点击的发生,实现方式较简单. 缺点是若客户端禁止JavaScript脚本,则失效. 在提交成功后执行页面重定向(redirect).转到提交成功信息页面. 特点:避免F5重复提交,消除浏览器前进和后退按钮可导致的同样问题. 表单隐藏域中存放session(表单被请求时生成的标记).采用此方法在接收表单数据后

PHP防止重复提交表单

<?php /* * PHP简单利用token防止表单重复提交 */ session_start(); header("Content-Type: text/html;charset=utf-8"); function set_token() { $_SESSION['token'] = md5(microtime(true)); } function valid_token() { $return = $_REQUEST['token'] === $_SESSION['toke

Struts2 token禁止重复提交表单

如果服务器响应慢的情况下,用户会重复提交多个表单,这时候有两种设计思想: 1.在客户端使用JS技术,禁止客户重复提交表单.但是这样会使一些不使用浏览器方式登陆的人比如使用底层通信来攻击你的服务器 2.在服务器端进行验证 Struts2设计了token标签来进行验证,在使用token时要注意,你点击两次之后,它会回到"invalid.tonken"那个页面,这时如果你使用回退的方式或者F5方式再次提交,会被拦截 使用token的方法: 1.在需要使用验证的的form标签里面,加入<

struts2中token防止重复提交表单

struts2中token防止重复提交表单 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年7月12日 11:52:32 星期日 http://fanshuyao.iteye.com/ 第一步:在表单中加上<s:token></s:token>

Ajax提交表单时验证码自动验证 php后端验证码检测

本文通过源码展示如何实现表单提交前,验证码先检测正确性,不正确则不提交表单,更新验证码. 1.前端代码 index.html <!DOCTYPE html> <html> <head> <title>验证码提交自验证</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta htt

重新理解了重定向,利用重定向可以防止用户重复提交表单(兼谈springmvc重定向操作)

自己用springmvc框架有一段时间了,但是都还一直分不清楚什么时候应该用转发,什么时候应该用重定向.可能用转发的情形太多了,以致于自己都忘记了还有重定向. 当用户提交post请求之后,刷新页面就会造成数据的再一次提交,也就是常说的重复提交.在网上查阅了相关资料,发现利用重定向可以有效防止重复提交数据. 重定向即客户端向服务器发送一个请求后,由服务端将请求按照程序里编码指定的请求方向再请求一次,在springmvc的开发中,返回一个重定向视图只需要在视图名称前加上"redirect:"

js 防止重复提交表单

var addFlag = true; function addQuestion(){ if(!addFlag){ return; } addFlag = false; //执行更新操作 jQuery.ajax({ type:'post', url:requestUrl, data:{ }, datatype:'json', success:function(data){ console.log(data.msg); addFlag = true; } }); } 通过设置标志防止重复提交 原文

javascript技巧篇(3) - 防止重复提交表单

在页面加入如下javascript程序代码: var checkSubmitFlag=false; var checkSubmit(){ function(){ if(checkSubmitFlag==true){ return false; } checkSubmitFlag=true; return true; } } //双击按钮就返回FALSE document.ondbclick=function docondbclick(){ window.event.returnValue=fal