springboot 重定向方式(redirect前缀)_第1页
springboot 重定向方式(redirect前缀)_第2页
springboot 重定向方式(redirect前缀)_第3页
springboot 重定向方式(redirect前缀)_第4页
springboot 重定向方式(redirect前缀)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第springboot重定向方式(redirect前缀)目录springboot重定向(redirect前缀)相关注解示例Spring重定向(Redirect)指南为什么要重定向?使用RedirectView重定向结论

springboot重定向(redirect前缀)

相关注解

@ModelAttribute:读取modelAndView中的数据

@Target({ElementType.PARAMETER,ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public@interfaceModelAttribute{

@AliasFor("name")

Stringvalue()default"";

@AliasFor("value")

Stringname()default"";

booleanbinding()defaulttrue;

示例

@RestController

publicclassHello3Controller{

@RequestMapping("/hello2")

publicModelAndViewhello2(){

ModelAndViewmv=newModelAndView();

mv.setViewName("redirect:/redirect2");

mv.addObject("attributeName","海贼王");

Personperson=newPerson();

person.setName("瓜田李下");

person.setAge(20);

mv.addObject("person",person);

returnmv;

@RequestMapping("/redirect2")

publicStringredirect2(StringattributeName,@ModelAttribute("attributeName")Stringname,Personperson,ModelAndViewmv){

System.out.println(attributeName+""+name);

System.out.println(person);

System.out.println(mv.getModelMap().getAttribute("attributeName"));

return"redirect2";

}

控制台输出

海贼王海贼王

Person(name=null,age=null)

null

说明:直接在方法体内获取数据,参数可以自动映射,也可使用@ModelAttribute获取数据;这种方式只能传递字符串,pojo对象不能传递

Spring重定向(Redirect)指南

为什么要重定向?

让我们先来考虑在Spring应用程序中为什么您可能需要做一个重定向的原因。

当然有很多可能的例子和原因。一个简单的可能是POST表单数据,围绕双重提交问题,或者只是将执行流委托给另一个控制器方法。

附注一点,典型的Post/Redirect/Get模式并不能充分解决双重提交问题-在初始提交完成之前刷新页面的问题可能仍然会导致双重提交。

使用RedirectView重定向

我们从这个简单的方法开始-直接来一个例子:

在背后,RedirectView会触发HttpServletResponse.sendRedirect()-这将执行实际的重定向。

注意这里我们是如何注入重定向属性到方法里面的-由框架完成这部分繁重的工作,让我们能够与这些属性交互。

我们添加attribute到模型RedirectAttributes中-将其作为HTTP查询参数(Queryparameter)暴露。该模型包含的对象-通常是字符串或可以被转换成字符串的对象。

现在让我们来测试我们的重定向功能-用一个简单的curl命令来帮助实现:

结果将是:

使用redirect:前缀进行重定向

前面一个方法使用RedirectView,因为一些原因它并不是最优的。

首先,我们现在是耦合于SpringAPI的,因为我们在我们的代码里直接地使用RedirectView。

其次,我们需要从一开始就知道,当实现控制器操作的时候,它的结果将总是重定向的,但情况并非总是如此。

更好的选择是使用redirect:前缀——重定向视图名称像其它逻辑视图名称一样被注入到控制器中。控制器甚至不知道重定向正在发生。

它看起来像是这样的:

当视图名称跟redirect:一起返回的时候,UrlBasedViewResolver类(以及它的所有子类)会将其识别为一个需要进行重定向的特殊指示。视图名称剩下的部分会被当作重定向URL。

这里有一个地方需要注意——当我们在这里使用redirect:/redirectedUrl逻辑视图的时候,我们正在做一个跟当前Servlet上下文相关的重定向。

如果需要重定向到一个绝对URL,我们可以使用像这样的名称:redirect:http://localhost:8080/spring-redirect/redirectedUrl。

所以现在,当我们执行curl命令:

我们会立刻得到一个重定向:

使用forward前缀转发

我们现在看看如何做一些略有不同的事——一个转发。

在看代码之前,我们先来看一下对转发与重定向的语义的快速、高层概括:

重定向将以包含302响应码和Location头的新URL进行响应;然后浏览器/客户端将再次向新的URL发出请求

转发完全在服务器端发生;Servlet容器将相同的请求转发到目标URL;浏览器中的URL无须改变

现在我们来看看代码:

与redirect:一样,forward:前缀将由UrlBasedViewResolver及其子类解析。在内部,这将创建一个InternalResourceView,它为新视图执行一个RequestDispatcher.forward()操作。

当我们用curl执行该命令时:

我们会得到HTTP405(不允许的方法):

与我们在重定向解决方案中的两个请求相比,在这种情况下,我们只有一个请求从浏览器/客户端发送到服务器端。当然,以前由重定向添加的属性也不需要了。

包含RedirectAttributes的属性

接下来-让我们看看在一个重定向中传递属性-充分利用框架中的RedirectAttribures:

如前所述,我们可以直接在方法中插入属性对象-这使得该机制非常容易使用。

还要注意,我们也添加一个Flash属性-这是一个不会被添加到URL中的属性。我们可以通过这种属性来实现——我们稍后可以在重定向的最终目标的方法中使用@ModelAttribute(“flashAttribute”)来访问flash属性:

因此,圆满完工——如果你需要使用curl测试该功能:

我们将会被重定向到新的位置:

这样,使用RedirectAttribures代替ModelMap,赋予我们仅在重定向操作中涉及的两种方法之间共享一些属性的能力。

没有前缀的另一种配置

现在让我们探索另一种配置——没有前缀的重定向。

为了实现这一点,我们需要使用org.springframework.web.servlet.view.XmlViewResolver:

代替我们在之前配置里使用的org.springframework.web.servlet.view.InternalResourceViewResolver:

我们还需要在配置里面定义一个RedirectViewbean:

现在我们可以通过id来引用这个新的bean来触发重定向:

为了测试它,我们再次使用curl命令:

结果会是:

重定向HTTPPOST请求Request

对于类似银行付款这样的用例,我们可能需要重定向HTTPPOST请求。根据返回的HTTP状态码,POST请求可以重定向到HTTPGET或POST上。

根据HTTP1.1协议参考,状态码301(永久移除)和302(已找到)允许请求方法从POST更改为GET。该规范还定义了不允许将请求方法从POST更改为GET的相关的307(临时重定向)和308(永久重定向)状态码。

现在,我

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论