springboot——重定向解決刷新瀏覽器造成表單重復提交的問題(超詳細)


原因:造成表單重復提交的原因是當我們刷新瀏覽器的時候,瀏覽器會發送上一次提交的請求。由於上一次提交的請求方式為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";
        }
    }
}

 完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM