1、什么是表单重复提交
1.1 刷新页面
在jsp页面点击提交后,会有一个post请求发到testController中,该Controller直接返回success视图。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>首页
@RequestMapping("hello") public String test() throws InterruptedException { System.out.println("重复提交"); //Thread.sleep(10000); return "success"; }
此时虽然页面跳转到了success视图,但是浏览器URL里显示的还是hello,如果此时刷新浏览器那么会重复是向后台提交数据。
1.2 响应过慢
上面这种情况还可以通过redirect解决,即登陆后的页面重定向到新的页面来避免。但如果是因为网速过慢导致的页面没有发生跳转,用户以为此时没有发出请求而重复点击提交按钮也会造成表单重复提交。
还是上面的jsp,我在Controller里加入睡眠来模拟网速太慢造成的相应过慢。此时点击提交后会看到页面处在加载状态但是没有发生跳转,如果再次点击提交也会造成重复提交。
@RequestMapping("hello") public String test() throws InterruptedException { System.out.println("重复提交"); Thread.sleep(10000); return "success"; }
2、后端如何解决表单重复提交
表单重复提交在前端可以通过js来解决,但是如果浏览器禁用了js就无效了。
通过token来实现这一功能需要分为两步,需要对两个Controller下手:1、对跳转到登陆页面的Controller,每次来都这个Controller的时候加入Token 2、对post请求的Controller,每次检验并删除Token。