我们前边说道了Struts2的使用15个内建的验证器、自定义验证器、多个字段如何在形同验证规则的情形下使用相同的验证错误消息和如何终止某个拦截器之后的其他拦截器的行为。今天我们来说一说Struts2框架如何帮助我们解决表单重复提交的问题。
1. 什么是表单重复提交
顾名思义,就是表单提交了多次,在提交多次的过程中存在了资源重复的问题。我们就是要解决这类型的问题。
表单重复提交的情况有很多种:
在不刷新页面的情况下,多次点击提交按钮,;在不刷新页面的情况下,已经提交成功,返回之后,再次提交;当控制器响应页面的方式为转发,若已经提交成功,在成功页面再次刷新也是重复。而如果是重定向的方式,提交成功之后再成功页面再次刷新是不会是表单重复提交的。
2. 重复提交的危害
增加服务器负担,可能导致错误操作。
3.Struts2如何解决表单重复提交的问题
① 我们首先需要在表单页面的form标签下配置一个<s:token></s:token>标签,这个标签在提交的同时会生成一个隐藏于的属性,同时将这个隐藏于属性的值给到session中。二者是一致的。当重复提交表单时,session中的值会remove掉,而隐藏域属性依然存在,这时二者的值就会不一致。
② Stuts2框架可以使用token或者tokenSeeion拦截器进行表单重复提交操作的处理,这两个拦截器都不在默认的default-stack拦截器栈中,需要我们在struts.xml的action手动的指明使用到的token或者tokenSession拦截器(这里体现了拦截器的可插拔性)。若是使用token拦截器的话,还需要为这个action的token拦截器设置一个result相应页面,其name=“token.invalid”,并在这个页面中使用<s:actionerror>来读取表单重复提交的错误消息。这个错误消息的格式我们也可以进行修改,在strusts.jar的struts包下找到default-message.properties,然后找到struts.messages.invalid.token这个变量来定义自己的错误消息的内容并将这个变量放到自己的i18n资源文件中就可以使用了。而使用tokenSession拦截器的话,这个action请求依然会响应配置的响应页面,但是不会执行tokenSession拦截器之后的所有的拦截器和action方法,就好像什么都没有发生一样。