解决方法和原因--->
解决方法:
一、在页面生成一个随机数,放在session域中;
二、并在form表单中设置一个隐藏标签,值为之前生成的随机数,和表单数据一起提交给后台;
三、后台对表单中的随机数进行判断:
1、表单随机数为空
2、session中随机数为空(1、2可能是未走页面入口)
3、表单随机数与session中的随机数不相等(表单随机数共享request中的数据,所以一直都是一样的,而session中的随机数是每次进页面重新产生的。这导致两个随机数不相等)
四、以上三种情况都说明表单是重复提交的,后台可以不进行表单处理操作直接返回。
五、除此三种情况,对表单进行正常处理,正常业务进行完要记得将session中的随机数移除;
原因:
Q:添加完数据后重新进入了页面,按理来说表单数据被清空了,为什么再次刷新还是能提交先前表单的数据,如
<input type="hidden" name="forward" value="/jsp/room/roomList.jsp">
A:这是转发与重定向的区别:
forward共享同一个request(准确来说,在jboss与tomcat中,两个request是不一样的。第一次的请求对象是org.apache.catalina.connector.RequestFacade@xxxxxxxx;转发后,服务器对第一次的请求对象进行了转换,请求对象变成了org.apache.catalina.core.ApplicationHttpRequest@xxxxxxxx。但是他们两者都实现了ServletRequest接口,可以互相转换)。
当再次刷新页面时,后台接收的request中数据和上次一样,所以看起来又进行了一次表单提交,这就是为什么刷新页面会重新提交表单。所以,将转发换成重定向也能解决刷新重复提交表单的问题。
参考与转载自:https://www.cnblogs.com/bulrush/p/5668721.html
https://blog.csdn.net/qx5211258/article/details/45220135
https://bbs.csdn.net/topics/390899266(关于转发,两次请求是否是同一个request对象)