iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring重定向的示例分析
  • 519
分享到

Spring重定向的示例分析

spring 2023-05-30 23:05:24 519人浏览 独家记忆
摘要

这篇文章主要介绍了spring重定向的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 概述本文将重点介绍在 Spring 中实现重定向(Redirect),并将讨

这篇文章主要介绍了spring重定向的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1. 概述

本文将重点介绍在 Spring 中实现重定向(Redirect),并将讨论每个策略背后的原因。

2. 为什么要重定向?

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

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

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

3、使用  RedirectView 重定向

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

@Controller@RequestMapping("/")public class RedirectController {     @GetMapping("/redirectWithRedirectView")  public RedirectView redirectWithUsingRedirectView(RedirectAttributes attributes) {    attributes.addFlashAttribute("flashAttribute", "redirectWithRedirectView");    attributes.addAttribute("attribute", "redirectWithRedirectView");    return new RedirectView("redirectedUrl");  }}

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

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

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

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

curl -i http://localhost:8080/spring-rest/redirectWithRedirectView

结果将是:

HTTP/1.1 302 FoundServer: Apache-Coyote/1.1Location:  http://localhost:8080/spring-rest/redirectedUrl?attribute=redirectWithRedirectView

4. 使用redirect:前缀进行重定向

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

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

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

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

它看起来像是这样的:

@Controller@RequestMapping("/")public class RedirectController {     @GetMapping("/redirectWithRedirectPrefix")  public ModelAndView redirectWithUsingRedirectPrefix(ModelMap model) {    model.addAttribute("attribute", "redirectWithRedirectPrefix");    return new ModelAndView("redirect:/redirectedUrl", model);  }}

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

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

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

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

curl -i http://localhost:8080/spring-rest/redirectWithRedirectPrefix

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

HTTP/1.1 302 FoundServer: Apache-Coyote/1.1Location:  http://localhost:8080/spring-rest/redirectedUrl?attribute=redirectWithRedirectPrefix

5. 使用forward前缀转发:

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

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

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

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

现在我们来看看代码:

@Controller@RequestMapping("/")public class RedirectController {     @GetMapping("/forwardWithForwardPrefix")  public ModelAndView redirectWithUsingForwardPrefix(ModelMap model) {    model.addAttribute("attribute", "forwardWithForwardPrefix");    return new ModelAndView("forward:/redirectedUrl", model);  }}

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

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

curl -I http://localhost:8080/spring-rest/forwardWithForwardPrefix

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

HTTP/1.1 405 Method Not AllowedServer: Apache-Coyote/1.1Allow: GETContent-Type: text/html;charset=utf-8

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

6. 包含RedirectAttributes的属性

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

@GetMapping("/redirectWithRedirectAttributes")public RedirectView redirectWithRedirectAttributes(RedirectAttributes attributes) {   attributes.addFlashAttribute("flashAttribute", "redirectWithRedirectAttributes");  attributes.addAttribute("attribute", "redirectWithRedirectAttributes");  return new RedirectView("redirectedUrl");}

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

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

@GetMapping("/redirectedUrl")public ModelAndView redirection( ModelMap model,  @ModelAttribute("flashAttribute") Object flashAttribute) {      model.addAttribute("redirectionAttribute", flashAttribute);   return new ModelAndView("redirection", model); }

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

curl -i http://localhost:8080/spring-rest/redirectWithRedirectAttributes

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

HTTP/1.1 302 FoundServer: Apache-Coyote/1.1Set-Cookie: jsESSIONID=4B70D8FADA2FD6C22E73312C2B57E381; Path=/spring-rest/; HttpOnlyLocation: http://localhost:8080/spring-rest/redirectedUrl; jsessionid=4B70D8FADA2FD6C22E73312C2B57E381?attribute=redirectWithRedirectAttributes

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

7. 没有前缀的另一种配置

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

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

<bean class="org.springframework.web.servlet.view.XmlViewResolver">  <property name="location">    <value>/WEB-INF/spring-views.xml</value>  </property>  <property name="order" value="0" /></bean>

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

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

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

<bean id="RedirectedUrl" class="org.springframework.web.servlet.view.RedirectView">  <property name="url" value="redirectedUrl" /></bean>

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

@Controller@RequestMapping("/")public class RedirectController {     @GetMapping("/redirectWithXMLConfig")  public ModelAndView redirectWithUsingXMLConfig(ModelMap model) {    model.addAttribute("attribute", "redirectWithXMLConfig");    return new ModelAndView("RedirectedUrl", model);  }}

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

curl -i http://localhost:8080/spring-rest/redirectWithRedirectView

结果会是:

HTTP/1.1 302 FoundServer: Apache-Coyote/1.1Location:  http://localhost:8080/spring-rest/redirectedUrl?attribute=redirectWithRedirectView

8. 重定向HTTP POST请求 Request

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

根据HTTP 1.1协议参考,状态码301(永久移除)和302(已找到)允许请求方法从POST更改为GET。该规范还定义了不允许将请求方法从POST更改为GET的相关的307(临时重定向)和308(永久重定向)状态码。
现在,我们来看看将post请求重定向到另一个post请求的代码:

@PostMapping("/redirectPostToPost")public ModelAndView redirectPostToPost(HttpServletRequest request) {  request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);  return new ModelAndView("redirect:/redirectedPostToPost");}
@PostMapping("/redirectedPostToPost")public ModelAndView redirectedPostToPost() {  return new ModelAndView("redirection");}

现在,让我们使用curl命令来测试下重定向的POST:

curl -L --verbose -X POST http://localhost:8080/spring-rest/redirectPostToPost

我们正在被重定向到目标地址:

> POST /redirectedPostToPost HTTP/1.1> Host: localhost:8080> User-Agent: curl/7.49.0> Accept: */*> < HTTP/1.1 200 < Content-Type: application/JSON;charset=UTF-8< Transfer-Encoding: chunked< Date: Tue, 08 Aug 2017 07:33:00 GMT {"id":1,"content":"redirect completed"}

感谢你能够认真阅读完这篇文章,希望小编分享的“Spring重定向的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Spring重定向的示例分析

本文链接: https://www.lsjlt.com/news/222192.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring重定向的示例分析
    这篇文章主要介绍了Spring重定向的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 概述本文将重点介绍在 Spring 中实现重定向(Redirect),并将讨...
    99+
    2023-05-30
    spring
  • Linux中重定向的示例分析
    这篇文章给大家分享的是有关Linux中重定向的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。简介      在计算领域,重定向是大多数命令行解释器所具有的...
    99+
    2023-06-09
  • Linux中io重定向的示例分析
    这篇文章给大家分享的是有关Linux中io重定向的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux io重定向是将原本要输出到屏幕中的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中(/de...
    99+
    2023-06-27
  • SpringMVC 重定向参数RedirectAttributes的示例分析
    这篇文章主要介绍SpringMVC 重定向参数RedirectAttributes的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!重定向参数RedirectAttributesSpringMVC 中...
    99+
    2023-06-22
  • Shell中管道重定向的示例分析
    小编给大家分享一下Shell中管道重定向的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.8.1 匿名管道"|"管道符号意如其名,类似管道一样将管道入口的数据通过管道传递给管道出口。管道是为了...
    99+
    2023-06-09
  • Linux中重定向和管道的示例分析
    这篇文章主要介绍了Linux中重定向和管道的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 ...
    99+
    2023-06-27
  • linux中管道及重定向的示例分析
    这篇文章主要介绍了linux中管道及重定向的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在linux系统中,大多数命令很简单,很少出现复杂功能的命令,每个命令往往实...
    99+
    2023-06-12
  • linux中Bash管道与重定向的示例分析
    这篇文章主要为大家展示了“linux中Bash管道与重定向的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中Bash管道与重定向的示例分析”这篇文章吧。管道与重定向Bash的标...
    99+
    2023-06-27
  • angular双向绑定的示例分析
    这篇文章主要为大家展示了“angular双向绑定的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“angular双向绑定的示例分析”这篇文章吧。双向绑定原理双向绑定将属性绑定与事件绑定结合...
    99+
    2023-06-22
  • Shell输出重定向实例分析
    这篇文章主要介绍了Shell输出重定向实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Shell输出重定向实例分析文章都会有所收获,下面我们一起来看看吧。Linux 命令默认从标准输入设备(stdin)获...
    99+
    2023-06-27
  • http永久重定向实例分析
    这篇文章主要介绍“http永久重定向实例分析”,在日常操作中,相信很多人在http永久重定向实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”http永久重定向实例分析”...
    99+
    2024-04-02
  • Angular10中双向绑定的示例分析
    这篇文章主要介绍了Angular10中双向绑定的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。将利用@Input()和@Output...
    99+
    2024-04-02
  • Python的print输出重定向举例分析
    本篇内容介绍了“Python的print输出重定向举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python中调试程序使用最多的是p...
    99+
    2023-06-02
  • Spring的示例分析
    这篇文章将为大家详细讲解有关Spring的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WHY在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于E...
    99+
    2023-05-30
    spring
  • Spring AOP的示例分析
    这篇文章主要为大家展示了“Spring AOP的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring AOP的示例分析”这篇文章吧。Spring中对AOP的支持Spring中AOP...
    99+
    2023-05-30
    spring aop
  • Spring Cloud中Zuul重试机制的示例分析
    小编给大家分享一下Spring Cloud中Zuul重试机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下:开启Zuul功能通过源码了解Zu...
    99+
    2023-05-30
    springcloud zuul
  • 实现mvvm-simple双向绑定的示例分析
    这篇文章给大家分享的是有关实现mvvm-simple双向绑定的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mvvm模式解放DOM枷锁mvvm原理分析JavaScript...
    99+
    2024-04-02
  • shell命令中定向输出的示例分析
    这篇文章给大家分享的是有关shell命令中定向输出的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mycommand >mylog.txt 2>&1 应该是最经典的用法了。命令的结果可...
    99+
    2023-06-09
  • vue中数据双向绑定的示例分析
    这篇文章主要介绍了vue中数据双向绑定的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。* Object.definePro...
    99+
    2024-04-02
  • JavaScript中双向数据绑定的示例分析
    小编给大家分享一下JavaScript中双向数据绑定的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!双向数据绑定指的是将...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作