原因:造成表单重复提交的原因是当我们刷新浏览器的时候,浏览器会发送上一次提交的请求。由于上一次提交的请求方式为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";
}
}
}

完。

最新文章

  1. mybatis_基础篇
  2. tst、cmp、bne、beq指令
  3. 弹出popwindow 背景变暗
  4. MFC 响应控件消息
  5. 去除字符串中的html标记及标记中的内容
  6. img标签使用默认图片的一种方式
  7. 关闭 ubuntu System program problem detected
  8. Android中如何获取应用版本号
  9. hdu 2821 Pusher (dfs)
  10. 关于gnome
  11. yii2源码学习笔记(十七)
  12. google zxing 二维码扫描(android client分析)
  13. 虎扯:纯css3各方向小三角的制作原理分析
  14. 字符串-06. IP地址转换
  15. 【Android开源项目分析】android轻量级开源缓存框架——ASimpleCache(ACache)源代码分析
  16. Sublime Text中安装插件来实现px与rem间的换算
  17. mybatis运行时拦截ParameterHandler注入参数
  18. 查找修补文件差异diff、patch
  19. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
  20. IT题库5-并发和并行

热门文章

  1. Python练习3-XML-RPC实现简单的P2P文件共享
  2. pr恢复工作区
  3. json的解析和生成
  4. vue中v-if与v-show的区别以及使用场景
  5. SpringBoot+MyBatis练手项目笔记汇总
  6. 拦截器(Interceptor)与过滤器(Filter)
  7. CRM系统实施的原则
  8. ES6学习-0 前言
  9. 探索专有领域的端到端ASR解决之道
  10. Unix下 压缩和解压缩命令