//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;
}
}
分享到:
相关推荐
javascript方式防止表单重复提交,
提交表单后提交禁用提交按钮,防止重复提交.
客户端防表单重复提交和服务器端session防表单重复提交.
springboot2.1+redis+拦截器 防止表单重复提交详细完整介绍,所用到的文件都上传了,下载即可使用。自己花了半天整理,并且测试通过,使用在实际项目中的,希望对每一个下载的朋友有帮助。
主要介绍了spring boot 防止重复提交实现方法,结合实例形式详细分析了spring boot 防止重复提交具体配置、实现方法及操作注意事项,需要的朋友可以参考下
好友使用vue技术封装了一个专门用于提交表单和下载文件的“防抖按钮”,其实现原理和使用方法看这里 https://blog.csdn.net/PursueExcellence/article/details/103903139。
防止表单重复提交。判断是新打开的页面还是刷新的页面 判断是新打开的页面还是刷新的页面
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
先说对话框(Dialog)里的表单提交 错误方案 说起错误方案,比如,点击提交按钮,本地验证,验证通过立即让按钮不可点,这些没问题,而我的错误点概括是:在某个最后执行的回调函数的最后一行,我做了2个操作:1,...
自定义封装注解类,(生成token存放到redis中)通过注解的方式解决API接口幂等设计防止表单重复提交
当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。...
防止用户表单重复提交的完整demo 分别在js与后台中处理,js处理(针对网络慢情况) 后台处理(针对用户点击浏览器上的刷新按钮等)
这是一个关于防止表单重复提交的练习,大神勿喷!
今天小编就为大家分享一篇防止Layui form表单重复提交的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
ASP.NET中防止刷新页面造成表单重复提交
防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。
如何修改禁止多次重复提交
几种防止表单重复提交的方法 禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。 我之前的文章曾说...
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
这里是Struts2 中放置表单重复提交的例子。