本文共 3328 字,大约阅读时间需要 11 分钟。
今天回顾自己做的一个SSM项目的时候,忽然发现有一个小瑕疵,那就是重复提交表单的问题。那么什么叫重复提交表单呢?我们直接用大白话解释,举例:当你从登录界面跳转到自己的主页的时候,我们的后端中肯定会有一个带有 @PostMapping注解的方法,这个时候我们如果跳转到自己的主页,并不断的点击刷新就会出现重复提交表单的问题。如果没理解上面的意思,我们来通过代码和图片演示来进行理解
login.html//...
如上代码的作用:点击登录按钮,会向后端发送/loginadmin请求。
AdminLoginController类//..1 @PostMapping("/loginadmin")2 public String login(Mapmap,NewsInformation newsInformation){ logger.info("招聘信息查询。。。"+newsInformation); List newsInformations=newsInformationDao.findAll() ;5 map.put("newsInformation",newsInformations);6 return "Administrator/main/indexs";}//..
第1行接受前端发送/loginadmin的请求;第2行的方法参数中定义的两个类。1:Map类表示的是模型数据存储的基本类型,模型数据按照Key:Value的形式保存。2:NewsInformation 类是从数据库获取新闻信息的值,然后进行视图渲染。第5行表示在map中进行视图渲染;第6行表示返回该Administrator/main/indexs路径下的页面。
这个时候,我们启动主程序,到登录界面进行登录(这里的过程忽略,这就是web开发项目),跳转到如下的主界面,进行重复刷新,就会出现重复提交。
那为什么会出现重复提交呢???我们在点击刷新按钮的时候,看上图的访问路径 http://localhost:8888/loginadmin。这个过程就相当于是,我们一直提交@PostMapping("/loginadmin")的请求,重复提交了。所以就出现了重复提交表单的问题。 下一章节来给大家介绍,如何解决重复提交的问题和它所带来的蝴蝶效应解决重复提交表单的问题,我们可以通过redirect重定向来解决,在Servlet API中,请求类型常见的有重定向redirect、转发forward和包含include。重定向通过返回重定向响应实现。我们只需要在上面的AdminLoginController类中,添加一个接收重定向的请求的方法,并在上面的login方法中,以重定向的形式返回
代码演示 AdminLoginController类//..1 @PostMapping("/loginadmin")2 public String login(Mapmap,NewsInformation newsInformation){ logger.info("招聘信息查询。。。"+newsInformation); List newsInformations=newsInformationDao.findAll() ;5 map.put("newsInformation",newsInformations);//return "Administrator/main/indexs";6 return "redirect:/main.html";}8 @GetMapping("/main.html") public String mainPage(){ System.out.println("解决重复提交表单的问题。。。"); return "Administrator/main/indexs"; }//..
第6行以重定向的形式返回main.html,然后交给第8行@GetMapping("/main.html")接受请求,返回到自己的主界面中。
我们启动主程序类,进行测试
这个时候一直点击刷新不会出现重复提交的原因是,我们这个时候的地址是http://localhost:8888/main.html,如果我们一直点击刷新,前端只会提交/main.html的请求,就不会出现重复提交。到这里,大家有没有发现,
第一章我们没有使用重定向提交请求的时候,我们可以获取到校园新闻信息主界面下的新闻(map.put(“newsInformation”,newsInformations);这一行代码生效), 第二章我们使用重定向提交的时候,我们获取不到校园新闻信息主界面下的新闻(map.put(“newsInformation”,newsInformations);这一行代码失效),那这是为什么呢?这就是redirect在搞鬼,使用它无法将值轻松地传递给目标页面。第三章,我们就来解决此问题,让新闻界面的值可以顺利展现出来这里跟大家讲一个小知识:视图有重定向的概念,重定向是通过向浏览器返回状态码302,并设置响应头中的Location为需要重定向的地址实现的。
重定向的视图只需要在视图名前添加rediret前缀即可,此时转发视图会自动处理视图名为URL视图,并对HTTP的响应设置状态码为302,响应头上转发视根据redirect:后面的名称取到的地址。同时重定向时的属性传递也比较特殊。
我们通过一个演示,来说明上面两段话的意思。
在浏览器中我们右键点击检查页面,然后再次进行登录演示。我们可以通过检查页面,发现两个特殊的请求。Rerirectctributes接口比较特殊,继承了Model 接口,该接口为重定向参数的传递提供了特殊方式,通过addFlashAttribute添加重定向可以使用的Model参数。其实现原理是通过Session存储重定向,是设置在RedirectAttributes 中的属性。
我们只需在上面的代码作如下修改即可
AdminLoginController类//..1 @PostMapping("/loginadmin")2 public String login(RedirectAttributes redirectAttributes,NewsInformation newsInformation){ logger.info("招聘信息查询。。。"+newsInformation); ListnewsInformations=newsInformationDao.findAll() ;5 redirectAttributes.addFlashAttribute("newsInformation",newsInformations);//return "Administrator/main/indexs";6 return "redirect:/main.html";}8 @GetMapping("/main.html") public String mainPage(){ System.out.println("解决重复提交表单的问题。。。"); return "Administrator/main/indexs"; }//..
在主程序进行测试,发现成功展示该界面。
转载地址:http://trozi.baihongyu.com/