怎么防止页面重复提交

怎么防止页面重复提交

问:Springboot 使用AOP实现防止接口重复提交
  1. 答:在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端。页面提交请求携带这个提交令牌,后端验证并在第一次验证后删除该令牌,保证提交请求的唯一性。
    思路没有问题,但是需要前后端都稍加改动,如果在业务开发完再加这个的话,改动量未免有些大了。无需前端配合,纯后端处理,是最清爽的。设计思路如下:
    自定义注解@RreventReSubmit标记所有Controller中的提交请求。通过AOP 对所有标记@RreventReSubmit的方法拦截。在业务方法执行前,获取当前用户的 token(或者JSessionId)+ 当前请求地址,作为一个唯一 KEY,去获取 Redis 分布式锁(如果此时并发获取,只有一个线程会成功获取锁)。当有请求调用接口时,到redis中查找相应的key,如果能找到,则说明重复提交,如果找不到,则执行操作。业务方法执行后,释放锁。
    切面类需要使用@Aspect和@Component这两个注解做标注。
    在想要防止重复提交的接口上添加注解即可使用。
问:JSP怎样避免刷新页面时重复提交表单数据?
  1. 答:解决办法:在表单第一次到后台,在执行代码的最后部分加上重新指向本页,模仿我们首次进入本页的效果。
  2. 答:一、页面重定向。
    二、token防止重复提交。
    建议使用第二种
问:在java中怎么防止页面重复提交
  1. 答:1.新建两个文件
    index.jsp -- 表单页面
    ess.jsp -- 结果提示页面
    2
    2.代码分别如下:
    3
    3.新建TokenServlet,代码如下
    4
    4.运行index.jsp,输入用户名,点击提交
    5
    5.正常跳转结果页面
    6
    6.但当我在这个页面点击刷新的时候,出现如下提示
    7
    7.点击重试,发现又一次调用了servlet,这就是一个重复提交
    8
    8.多刷新几次,注意看URL地址,现在仍然是servlet
    9
    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,这时可以正常提交了
怎么防止页面重复提交
下载Doc文档

猜你喜欢