springboot 重定向方式(redirect前缀)

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

springboot 重定向(redirect前缀)

相关注解

@ModelAttribute:读取modelAndView中的数据

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModelAttribute {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean binding() default true;
}

示例

@RestController
public class Hello3Controller {
    @RequestMapping("/hello2")
    public ModelAndView hello2(){
        ModelAndView mv=new ModelAndView();
        mv.setViewName("redirect:/redirect2");
        mv.addObject("attributeName","海贼王");

        Person person=new Person();
        person.setName("瓜田李下");
        person.setAge(20);
        mv.addObject("person",person);
        return mv;
    }

    @RequestMapping("/redirect2")
    public String redirect2(String attributeName,@ModelAttribute("attributeName") String name,Person person,ModelAndView mv){
        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 查询参数(Query parameter)暴露。 该模型包含的对象 - 通常是字符串或可以被转换成字符串的对象。

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

结果将是:

使用 redirect: 前缀进行重定向

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

首先,我们现在是耦合于Spring API的,因为我们在我们的代码里直接地使用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执行该命令时:

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

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

包含 RedirectAttributes 的属性

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

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

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

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

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

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

没有前缀的另一种配置

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

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

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

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

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

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

结果会是:

重定向 HTTP POST 请求 Request

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

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

现在,我们来看看将post请求重定向到另一个post请求的代码:

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

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

结论

本文介绍了在Spring中实现重定向的三种不同方法,在执行这些重定向时如何处理/传递属性以及如何处理HTTP POST请求的重定向。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot 如何重定向redirect 并隐藏参数

    目录 springboot 重定向redirect 并隐藏参数 1.全局异常处理方法 2.重定向方法 springboot redirect 传参问题 具体案例 springboot 重定向redirect 并隐藏参数 在做全局异常处理的时候,碰到重定向到全局错误页面 所谓隐藏参数无非是把参数放到了session中,再重定向后将该值清除 1.全局异常处理方法 @ExceptionHandler(value = Exception.class) public ModelAndView except

  • Springboot转发重定向实现方式解析

    1.转发 方式一:使用 "forword" 关键字(不是指java关键字),注意:类的注解不能使用@RestController 要用@Controller @RequestMapping(value="/test/test01/{name}" , method = RequestMethod.GET) public String test(@PathVariable String name) { return "forword:/ceng/hello.h

  • springboot项目拦截器重定向循环问题的解决

    目录 springboot项目拦截器重定向循环 解决办法 springboot拦截器无限循环报错 springboot项目拦截器重定向循环 本菜鸟很久没写东西了,这回是解决了一个小问题,希望能帮助到你. 最近写了一个项目,项目中写了登录拦截器,session过期的用户请求会重定向到登录页面. 写完测试发现session过期后浏览器一直提示重定向次数过多. 打开浏览器F12看到一直都在访问/login/login/login之类的无限循环路径. 后来经过网上查询发现我之前设置重定向地址时直接设置的

  • 基于springboot redirect重定向路径问题总结

    目录 SpringMVC重定向视图RedirectView小分析 前言 实例讲解 Controller代码 我们通过firebug看下路径: 总结 SpringMVC重定向视图RedirectView小分析 前言 SpringMVC是目前主流的Web MVC框架之一. 本文所讲的部分内容跟SpringMVC的视图机制有关,SpringMVC的视图机制请参考楼主的另一篇博客: RedirectView这个视图是跟重定向相关的,也是重定向问题的核心,我们来看看这个类的源码. 路径构造完毕之后使用re

  • springboot 重定向方式(redirect前缀)

    目录 springboot 重定向(redirect前缀) 相关注解 示例 Spring 重定向(Redirect)指南 为什么要重定向? 使用 RedirectView 重定向 结论 springboot 重定向(redirect前缀) 相关注解 @ModelAttribute:读取modelAndView中的数据 @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @

  • 详解python的几种标准输出重定向方式

    一. 背景 在Python中,文件对象sys.stdin.sys.stdout和sys.stderr分别对应解释器的标准输入.标准输出和标准出错流.在程序启动时,这些对象的初值由sys.__stdin__.sys.__stdout__和sys.__stderr__保存,以便用于收尾(finalization)时恢复标准流对象. Windows系统中IDLE(Python GUI)由pythonw.exe,该GUI没有控制台.因此,IDLE将标准输出句柄替换为特殊的PseudoOutputFile

  • Spring 重定向(Redirect)指南及相关策略问题

    概述 本文将重点介绍在 Spring 中实现重定向(Redirect),并将讨论每个策略背后的原因. 为什么要重定向? 让我们先来考虑在 Spring 应用程序中为什么您可能需要做一个重定向的原因. 当然有很多可能的例子和原因. 一个简单的可能是 POST 表单数据,围绕双重提交问题,或者只是将执行流委托给另一个控制器方法. 附注一点,典型的 Post / Redirect / Get 模式并不能充分解决双重提交问题 - 在初始提交完成之前刷新页面的问题可能仍然会导致双重提交. 使用  Redi

  • SpringBoot AOP方式实现多数据源切换的方法

    最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据库的性能,考虑把这个查询走从库.所以涉及到需要在一个项目中配置多数据源,并且能够动态切换.经过一番摸索,完美实现动态切换,记录一下配置方法供大家参考. 设计总体思路 Spring-Boot+AOP方式实现多数据源切换,继承AbstractRoutingDataSource实现数据源动态的获取,在service层使用注解指定数据源. 步骤 一.多数据源配置 在applica

  • 使用SpringBoot注解方式处理事务回滚实现

    我们在SpringBoot和MyBatis整合的时候,需要在SpringBoot中通过注解方式配置事务回滚 1 Pojo类 package com.zxf.domain; import java.util.Date; public class User { private Integer id; private String name; private String pwd; private String head_img; private String phone; private Date

  • SpringBoot+RabbitMQ方式收发消息的实现示例

    本篇会和SpringBoot做整合,采用自动配置的方式进行开发,我们只需要声明RabbitMQ地址就可以了,关于各种创建连接关闭连接的事都由Spring帮我们了~ 交给Spring帮我们管理连接可以让我们专注于业务逻辑,就像声明式事务一样易用,方便又高效. 祝有好收获,先赞后看,快乐无限. 本文代码:   https://gitee.com/he-erduo/spring-boot-learning-demo https://github.com/he-erduo/spring-boot-lea

  • Springboot Redis设置key前缀的方法步骤

    properties中配置 #redis redis.masterClusterNodes=10.40.57.197:7000;10.40.57.198:7002;10.40.57.199:7004 redis.slaveClusterNodes=10.40.57.197:7001;10.40.57.198:7003;10.40.57.199:7005 redis.maxTotal=50 redis.maxIdle=10 redis.minIdle=1 redis.maxWaitMillis=1

  • springboot 注解方式批量插入数据的实现

    目录 一.使用场景 二.实现方法 1.mysql表结构 2.domain 3.mapper 4.测试类 5.测试结果 三.插入效率对比 1.批量插入 2.一条一条插入 一.使用场景 一次请求需要往数据库插入多条数据时,可以节省大量时间,mysql操作在连接和断开时的开销超过本次操作总开销的40%. 二.实现方法 1.mysql表结构 2.domain package com.cxstar.order.domain; import java.util.Date; @lombok.Data publ

  • 使用springmvc配置视图解析器和重定向方式

    目录 springmvc配置视图解析器和重定向 为什么需要配置视图解析器 配置步骤 解决配置视图解析器带来的问题 重定向 配置多个视图解析器 springmvc controller springmvc配置视图解析器和重定向 为什么需要配置视图解析器 看图 配置步骤 第一步:需要在springmvc.xml配置 <!-- 配置SpringMVC的视图解析器: 配置前缀和后缀 --> <bean class="org.springframework.web.servlet.vie

  • mvc重定向方式详解

    本文实例为大家分享了mvc重定向的几种方式,供大家参考,具体内容如下 在RouteConfig添加一个简单的路由 //新增路由 routes.MapRoute( name: "Article", url: "Detial/{id}", defaults: new { controller = "Article", action = "Detial", id = UrlParameter.Optional }, constrai

随机推荐