1.POST-REDIRECT-GET
步骤:
1.controller中post请求执行后不调用forward方法直接去成功页面,而是把数据放到session里面,然后调用redirect方法让浏览器重新提交一个get请求到中间controller。
2.中间controller把session里面的值,取出来放到request里面,再把session里面的值remove,然后去到真正的成功页面,同时可以加判断,如果从session中一开始都没取到值就去到一个提示重复提交的页面
spring3.1之后可以用flashmap来实现,spring中有一个flashmapmanager,在请求的生命周期中自动处理了第二步里面的动作,无需自己处理
有一些缺点,会影响浏览器的刷新和后退行为
具体例子参考:http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31
2.synchronization token
步骤:
1.在页面上设置隐藏域,在第一个get请求时后台生成一个token,保存到session中,同时设置到页面隐藏域中
2.当form post以后,将隐藏域和session中的token做比较,如果相同,则remove session中的token,再进行后续处理
典型的例子struts2
3.客户端js
用js实现表单只能提交一次或者提交后按钮变灰,但是不安全,可以自己创建form绕开js自己提交