表单的重复提交问题虽然比较好解决,但却不容忽视,忽视重复提交可能给系统带来一系列的问题,首先相同的内容提交多遍,用户感知肯定不好,其次重复提交造成不必要的服务器压力,另外还会在数据库中产生很多冗余的数据。
避免表单的重复提交方法,根据功能的重要程度及数据的重要程度,可以依次添加前端js校验和服务器端校验。
Js校验主要有两种方法,一是添加标志位,可以在jsp中添加标志也可以直接在js中用一个变量表示是否已经提交,提交后标志位值或变量改变,在提交前直接判断标志位或变量的值是否是未提交的内容;二是在提交后让提交按钮失效。
很多时候由于用户安装的浏览器版本问题或者js的加载问题会使js校验失效,对于较重要的数据,保险起见,需要添加服务器端的校验。
服务器端校验也有多种方式。一是添加token拦截器,在webwork或struts中都有默认的token拦截器,打开页面时会在服务器端和客户端保存同一个随机码,页面提交时若随机码相同则可以提交到action处理,否则会被拦截,正常提交后服务器端的随机码会发生改变,页面第二次提交过来,就会被拦截了。添加token的方法比较方便,但也存在弊端,如果提交的内容需要在服务器端判断是否可用等情况,不可用再返回页面进行处理后再提交的情况,就不可用了,因为第一次进入action的时候,服务器端的随机码改变,再提交的时候就不能通过服务器端的校验了,这种情况下,服务器端的校验就必须在业务处理中完成了,按一般的业务处理思路,获取数据库中的内容,判断是否重复,重复的话返回提示语到页面,这种方式比较麻烦,另外需要多和数据库交互。
以上是本人对表单重复提交问题处理的一点总结,部分观点可能有不合理的地方,欢迎大家指正。
避免表单的重复提交方法,根据功能的重要程度及数据的重要程度,可以依次添加前端js校验和服务器端校验。
Js校验主要有两种方法,一是添加标志位,可以在jsp中添加标志也可以直接在js中用一个变量表示是否已经提交,提交后标志位值或变量改变,在提交前直接判断标志位或变量的值是否是未提交的内容;二是在提交后让提交按钮失效。
很多时候由于用户安装的浏览器版本问题或者js的加载问题会使js校验失效,对于较重要的数据,保险起见,需要添加服务器端的校验。
服务器端校验也有多种方式。一是添加token拦截器,在webwork或struts中都有默认的token拦截器,打开页面时会在服务器端和客户端保存同一个随机码,页面提交时若随机码相同则可以提交到action处理,否则会被拦截,正常提交后服务器端的随机码会发生改变,页面第二次提交过来,就会被拦截了。添加token的方法比较方便,但也存在弊端,如果提交的内容需要在服务器端判断是否可用等情况,不可用再返回页面进行处理后再提交的情况,就不可用了,因为第一次进入action的时候,服务器端的随机码改变,再提交的时候就不能通过服务器端的校验了,这种情况下,服务器端的校验就必须在业务处理中完成了,按一般的业务处理思路,获取数据库中的内容,判断是否重复,重复的话返回提示语到页面,这种方式比较麻烦,另外需要多和数据库交互。
以上是本人对表单重复提交问题处理的一点总结,部分观点可能有不合理的地方,欢迎大家指正。