如何防止表单重复提交问题
2022-12-30阅读(880)
问:spring mvc 如何防止表单重复提交
- 答:防止表单重复提交的两种方式
1)通过重定向
采取请求转发的方式完成表单内容的添加会造成内容的重复插入。
当向Servlet发送一条增加记录的请求后,servlet首先向数据库增加一条记录,然后又从数据库中查询出所有数据,接着转发到另一个页面,这时,页面上浏览器的地址显示的是servlet的地址,当用户刷新页面时,又会向servlet发送一条添加请求,这样会导致数据库中重复数据不断增加。
解决办法:采用重定向的方式添加数据不会导致数据的重复插入或删除。
向servlet发送一个添加请求时,这个servlet只执行添加操作,然后重定向到另一个servlet进行数据的查询,最后转发到显示页面。
2)通过Session Token(Session令牌)
当客户端第一次向服务器端发送请求的时候,服务器会通过Token标签,并且会将这个字符串放到session中,然后将这个字符串发送给客户端,在提交之前页面上就有了一个字符串,服务器端也有一个字符串,两个字符串的内容是一样的,当你提交的时候,服务器会比较两个字符串是不是一样的,如果是一样的,就是第一次提交,并且更新服务器端的字符串;如果此时再次重复提交,服务器端的字符串已经发生改变而页面中的那个字符串还没有变,这时,你提交的时候两个字符串就不匹配了,服务器端就会认为是第二次提交,这样,服务器就不会再让提交了,进而转向invalid.token那<result>所指向的页面。
其实就是第二次与第一次jsp页面向服务器提交的内容和第一次一模一样,当在浏览器上返回前一页时,表单中提交的内容和第一次也是易语言的,所以这种情况下提交也会失败,当返回前面一夜然后刷新,刷新相当于向服务器发送了一次请求,所以这样提交就可以成功。 - 答:防止表单重复提交的两种方式
1)通过重定向
采取请求转发的方式完成表单内容的添加会造成内容的重复插入。
当向Servlet发送一条增加记录的请求后,servlet首先向数据库增加一条记录,然后又从数据库中查询出所有数据,接着转发到另一个页面,这时,页面上浏览器的地址显示的是servlet的地址,当用户刷新页面时,又会向servlet发送一条添加请求,这样会导致数据库中重复数据不断增加。
解决办法:采用重定向的方式添加数据不会导致数据的重复插入或删除。
向servlet发送一个添加请求时,这个servlet只执行添加操作,然后重定向到另一个servlet进行数据的查询,最后转发到显示页面。
2)通过Session Token(Session令牌)
当客户端第一次向服务器端发送请求的时候,服务器会通过Token标签,并且会将这个字符串放到session中,然后将这个字符串发送给客户端,在提交之前页面上就有了一个字符串,服务器端也有一个字符串,两个字符串的内容是一样的,当你提交的时候,服务器会比较两个字符串是不是一样的,如果是一样的,就是第一次提交,并且更新服务器端的字符串;如果此时再次重复提交,服务器端的字符串已经发生改变而页面中的那个字符串还没有变,这时,你提交的时候两个字符串就不匹配了,服务器端就会认为是第二次提交,这样,服务器就不会再让提交了,进而转向invalid.token那<result>所指向的页面。
其实就是第二次与第一次jsp页面向服务器提交的内容和第一次一模一样,当在浏览器上返回前一页时,表单中提交的内容和第一次也是易语言的,所以这种情况下提交也会失败,当返回前面一夜然后刷新,刷新相当于向服务器发送了一次请求,所以这样提交就可以成功。
问:如何解决页面表单的重复提交问题
- 答:1.新建两个文件
index.jsp -- 表单页面
ess.jsp -- 结果提示页面
2.代码分别如下:
3.新建TokenServlet,代码如下
4.运行index.jsp,输入用户名,点击提交
5.正常跳转结果页面
6.但当我在这个页面点击刷新的时候,出现如下提示
7.点击重试,发现又一次调用了servlet,这就是一个重复提交
8.多刷新几次,注意看URL地址,现在仍然是servlet
9.以前说重定向可以解决表单重复提交的问题,我们修改Servlet代码如下
10.再次测试,发现重定向到了ess.jsp ,再点击刷新的话也不会出现重复提交了
11.那问题解决了么?再看,当我点击浏览器中的返回,然后再点击提交,如此反复,仍然在重复调用Servlet,这也是重复提交
12.现在修改Index.jsp
13.修改servlet代码
14.新建token文件,代码如下
15.在浏览器中测试(注,这里如果再使用Eclipse自带浏览器的话,会出现缓存问题,所以使用正常的浏览器火狐或者IE)
16.hidden中的token 和session中的token是相同的
17.当点击浏览器中的后退按钮,再次进行操作,发现不能重复提交
18.这是因为session中的token已经被移除掉了
19.而返回后刷新页面,相当于新开一个index.jsp 重新获取token 赋值给session,这时可以正常提交了
问:struts2 如何防止表单重复提交
- 答:struts2有自己的ognl标签库,你可以用token这个标签,令牌标签,自己会处理表单重复提交问题,你也可以使用jsp的自定义标签来处理,通过时间戳来判定.