表单防重复提交

//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;
	}

}



猜你喜欢

转载自13813962825.iteye.com/blog/2389815