原因:造成表單重復提交的原因是當我們刷新瀏覽器的時候,瀏覽器會發送上一次提交的請求。由於上一次提交的請求方式為post,刷新瀏覽器就會重新發送這個post請求,造成表單重復提交。
解決辦法:
將請求當前頁面的方式由請求轉發改為重定向到當前頁面即可。
舉例:
編寫一個處理登錄請求的controller,登錄成功就轉到dashboard.html,登錄失敗則跳轉到登錄頁面login.html重新登錄。
注:dashboard.html和login.htm都是templates包下的。
@Controller public class LoginController { @PostMapping("/user/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, Map<String,Object> map ){ if (StringUtils.isEmpty(username) && "123456".equals(password)){ return "dashboard"; }else { map.put("msg","用戶名或密碼錯誤"); return "login"; } } }
上邊這段代碼是不正確的,會造成表單重復提交。
當我們輸入正確賬號密碼時就會return "dashboard";就會經過視圖解析器轉發到了dashboard.html頁面,這樣當我們瀏覽器中刷新是就會造成重復提交。
所以我們不能return "dashboard",而要重定向到dashboard.html。
注意:重定向到templates包下的資源要經過視圖解析器處理,而重定向默認是不會經過視圖解析器的,所以我們要先編寫一個視圖映射。
編寫視圖映射:
@Configuration public class MyMvcConfig implements WebMvcConfigurer{ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/main.html").setViewName("dashboard"); } }
將轉發修改為重定向:代碼標紅位置
@Controller public class LoginController { @PostMapping("/user/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, Map<String,Object> map ){ if (!StringUtils.isEmpty(username) && "123456".equals(password)){ return "redirect:/main.html"; }else { map.put("msg","用戶名或密碼錯誤"); return "login"; } } }
完。