//struts2的实现方式:
//这种方法是在用户要提交的表单中,加入一个<s:token>标签,这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),并且发送给客户端的浏览器,同时,在服务器中,会把这个随机字符串保存到用户的session对象中。当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,所以这两个字符串相等,然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,会改变为其他的随机值,注意,这是很重要的一步!此时,地址栏停留在处理用户提交数据的Action中,客户端中保存的随机字符串没有改变,若是刷新页面,即重复提交,服务器再进行两个字符串的比较,会不相等,就会跳转到name为invalid.token的结果页面中,这样就会防止表单重复提交了。
//简单的说就是在加载页面的时候在页面中放入一个参数,同时在服务端的session中放入一个参数。页面表单第一次提交的时候,服务端会比较是不是跟session中的一致,一致则通过,同时把session中的参数的值修改为另一个。这样表单重复提交后,页面请求的参数和session中的参数的值不一致则认为是重复提交。
//因为我们项目用的是springmvc,所以我们是通过自定义标签的方式实现的。
//在需要加载页面中加入这个标签 <@test.noRepeatSubmit formName="employee"/>
//1.配置 Spring 配置文件,将以下配置添加到 Spring 配置文件中,为重复提交校验注解提供 Spring 支持。
<mvc:annotation-driven >
<mvc:argument-resolvers>
<bean class="com.test.validate.TestFormResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
public class TestFormResolver implements HandlerMethodArgumentResolver {
//判断MultiForm是不是一个Parameter注解
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(MultiForm.class) != null;
}
//解析参数,对应@MultiForm注解的参数
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
//获取当前的formID
String formID = request.getParameter("formID");
if(StringUtils.isNotEmpty(formID)){
//获取当前的formID的uuid
String currentUuid = request.getParameter(formID);
//获取session中的uuid
Object o = request.getSession().getAttribute(formID);
if(null == o || !o.toString().equals(currentUuid)){
return false;
}
}
request.getSession().removeAttribute(formID);
return true;
}
}
分享到:
相关推荐
例如,我们可以创建一个自定义注解`@NoRepeatSubmit`,并在需要防止重复提交的控制器方法上使用它。这个注解可以包含一些参数,如请求的唯一标识(如UUID)和允许的提交间隔时间等。 接着,我们需要一个中间件来...
总之,防止Layui表单重复提交的关键在于阻止表单的默认提交行为,并且在数据成功发送到服务器后,确保表单不会再次被提交。这不仅涉及到对Layui框架的熟悉,还需要对前端JavaScript和AJAX有深入的理解。通过上述方法...
8. **表单重定向(Redirect after Post)**:这是一种经典的防止重复提交的方法,提交表单后立即重定向到新的URL,这样即使用户再次点击提交,也会被重定向页面拦截。 9. **使用HTML5的formnovalidate属性**:对于...
Spring Boot 防止重复提交是指在用户提交表单或请求时,防止同一客户端在短时间内对同一 URL 的重复提交,从而避免服务器端的处理压力和数据的一致性问题。下面将详细介绍 Spring Boot 防止重复提交实现方法的相关...
提交表单后提交禁用提交按钮,防止重复提交.
在现代Web应用开发中,防止表单重复提交是一项重要的任务,因为这可能导致数据不一致性和服务器资源浪费。本文将深入探讨如何使用Spring Boot 2.1、Redis和拦截器来实现这一功能。以下是对这个主题的详细解释: ...
- 使用HTTP-only cookies:存储一个提交标志,当表单提交后设置此标志,后续请求检查该标志以防止重复提交。 - **结合服务器端和客户端验证**:为了增加安全性,通常建议同时在服务器端和客户端进行验证。客户端...
以下是如何在使用Element-UI时防止重复提交的具体方法: 1. 对话框(Dialog)内的表单提交: 错误方案常常是在最后的回调函数中同时隐藏Dialog和恢复提交按钮的可点击性。问题在于Dialog的隐藏是一个动画过程,这...
本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...
好友使用vue技术封装了一个专门用于提交表单和下载文件的“防抖按钮”,其实现原理和使用方法看这里 https://blog.csdn.net/PursueExcellence/article/details/103903139。
服务器验证Token的有效性,如果已经使用过或者不存在,就拒绝处理请求,从而防止重复提交。 三、Struts中实现Token机制的步骤 1. **配置Action** 在Struts配置文件中,为需要防止重复提交的Action添加一个拦截器...
防止重复提交对于确保数据的准确性和应用的稳定性至关重要。本文将深入探讨如何在ASP.NET环境中解决这个问题。 首先,理解问题的本质:当用户点击提交按钮两次或者由于网络延迟,浏览器可能会发送两次请求到服务器...
通过前端禁用提交按钮、使用Ajax异步请求,以及后端的Token验证、幂等性设计和事务控制,我们可以有效防止重复提交,确保系统数据的一致性和稳定性。在实际应用中,应根据项目需求和具体技术栈选择合适的方法。
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...
这种方法可以防止跨站请求伪造(CSRF)攻击,同时也可防止重复提交。 4. **Session存储状态** 另一种方法是利用session存储用户的提交状态。当表单被提交后,将一个标识符存入session,然后在处理请求时检查这个...
### ASP.NET中防止刷新页面造成表单重复提交 在Web应用程序开发中,特别是在使用ASP.NET进行网站构建时,一个常见的问题是表单重复提交。这通常发生在用户通过按下浏览器的F5键来刷新页面的情况下,此时之前的表单...