博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从解决重复提交表单的问题中教会你RedirectAttributes和重定向(redirect)的简单使用
阅读量:3960 次
发布时间:2019-05-24

本文共 3328 字,大约阅读时间需要 11 分钟。

文章目录

1:重复提交表单的演示和原因

今天回顾自己做的一个SSM项目的时候,忽然发现有一个小瑕疵,那就是重复提交表单的问题。那么什么叫重复提交表单呢?我们直接用大白话解释,举例:当你从登录界面跳转到自己的主页的时候,我们的后端中肯定会有一个带有 @PostMapping注解的方法,这个时候我们如果跳转到自己的主页,并不断的点击刷新就会出现重复提交表单的问题。如果没理解上面的意思,我们来通过代码和图片演示来进行理解

login.html

//... 
//...用户名和密码的代码模块,忽略不写

如上代码的作用:点击登录按钮,会向后端发送/loginadmin请求。

AdminLoginController类

//..1 @PostMapping("/loginadmin")2 public String login(Map
map,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")的请求,重复提交了。所以就出现了重复提交表单的问题。
下一章节来给大家介绍,如何解决重复提交的问题和它所带来的蝴蝶效应

2:解决重复提交表单——重定向的使用

解决重复提交表单的问题,我们可以通过redirect重定向来解决,在Servlet API中,请求类型常见的有重定向redirect、转发forward和包含include。重定向通过返回重定向响应实现。我们只需要在上面的AdminLoginController类中,添加一个接收重定向的请求的方法,并在上面的login方法中,以重定向的形式返回

代码演示
AdminLoginController类

//..1 @PostMapping("/loginadmin")2 public String login(Map
map,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在搞鬼,使用它无法将值轻松地传递给目标页面。第三章,我们就来解决此问题,让新闻界面的值可以顺利展现出来

2.1 浏览器返回状态码302

这里跟大家讲一个小知识:视图有重定向的概念,重定向是通过向浏览器返回状态码302,并设置响应头中的Location为需要重定向的地址实现的。

重定向的视图只需要在视图名前添加rediret前缀即可,此时转发视图会自动处理视图名为URL视图,并对HTTP的响应设置状态码为302,响应头上转发视根据redirect:后面的名称取到的地址。同时重定向时的属性传递也比较特殊。

我们通过一个演示,来说明上面两段话的意思。

在浏览器中我们右键点击检查页面,然后再次进行登录演示。我们可以通过检查页面,发现两个特殊的请求。
在这里插入图片描述

3:RedirectAttributes类的使用

Rerirectctributes接口比较特殊,继承了Model 接口,该接口为重定向参数的传递提供了特殊方式,通过addFlashAttribute添加重定向可以使用的Model参数。其实现原理是通过Session存储重定向,是设置在RedirectAttributes 中的属性。

我们只需在上面的代码作如下修改即可

AdminLoginController类

//..1 @PostMapping("/loginadmin")2 public String login(RedirectAttributes redirectAttributes,NewsInformation newsInformation){
logger.info("招聘信息查询。。。"+newsInformation); List
newsInformations=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/

你可能感兴趣的文章
Linux umount 报 device is busy 的处理方法
查看>>
一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
查看>>
提供机制而不是策略
查看>>
内核中断机制
查看>>
内核抢占
查看>>
编译linux内核源码 ubuntu
查看>>
epoll使用详解
查看>>
epoll
查看>>
The AnimationClip 'Walk' used by the Animation component 'Pig' must be marked as Legacy.
查看>>
《Linux内核设计与实现》- Linux的进程
查看>>
《Linux内核设计与实现》- 进程的调度
查看>>
inet_ntoa()
查看>>
POSIX消息队列mq_open问题
查看>>
两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];
查看>>
用户态切换到内核态的3种方式
查看>>
笔试常见的智力题(附答案)
查看>>
内核库函数
查看>>
Linux 系统内核空间与用户空间通信的实现与分析
查看>>
linux内核空间和用户空间的区别及交互
查看>>
如何写好应用型学术论文
查看>>