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.ModelMap().getAttribute("attributeName"));
return "redirect2";
}
}
控制台输出
海贼王海贼王
Person(name=null, age=null)
null
说明:直接在⽅法体内获取数据,参数可以⾃动映射,也可使⽤@ModelAttribute获取数据;这种⽅式只能传递字符串,pojo 对象不能传递
Spring 重定向(Redirect)指南
为什么要重定向?
让我们先来考虑在 Spring 应⽤程序中为什么您可能需要做⼀个重定向的原因。
当然有很多可能的例⼦和原因。⼀个简单的可能是 POST 表单数据,围绕双重提交问题,或者只是将执⾏流委托给另⼀个控制器⽅法。
附注⼀点,典型的 Post / Redirect / Get 模式并不能充分解决双重提交问题 - 在初始提交完成之前刷新页
⾯的问题可能仍然会导致双重提交。
使⽤ RedirectView 重定向
spring boot选择题
我们从这个简单的⽅法开始 - 直接来⼀个例⼦:
在背后,RedirectView 会触发 HttpServletResponse.sendRedirect() - 这将执⾏实际的重定向。
注意这⾥我们是如何注⼊重定向属性到⽅法⾥⾯的 - 由框架完成这部分繁重的⼯作,让我们能够与这些属性交互。
我们添加 attribute 到模型RedirectAttributes中 - 将其作为 HTTP 查询参数(Query parameter)暴露。
该模型包含的对象 - 通常是字符串或可以被转换成字符串的对象。
现在让我们来测试我们的重定向功能 - ⽤⼀个简单的 curl 命令来帮助实现:
结果将是:
使⽤ redirect: 前缀进⾏重定向
前⾯⼀个⽅法使⽤RedirectView,因为⼀些原因它并不是最优的。
⾸先,我们现在是耦合于Spring API的,因为我们在我们的代码⾥直接地使⽤RedirectView。
其次,我们需要从⼀开始就知道,当实现控制器操作的时候,它的结果将总是重定向的,但情况并⾮总是如此。
更好的选择是使⽤redirect:前缀——重定向视图名称像其它逻辑视图名称⼀样被注⼊到控制器中。控制器甚⾄不知道重定向正在发⽣。
它看起来像是这样的:
当视图名称跟redirect:⼀起返回的时候,UrlBasedViewResolver类(以及它的所有⼦类)会将其识别为⼀个需要进⾏重定向的
特殊指⽰。视图名称剩下的部分会被当作重定向URL。
这⾥有⼀个地⽅需要注意——当我们在这⾥使⽤redirect:/redirectedUrl逻辑视图的时候,我们正在做⼀个跟当前Servlet上下⽂相关的重定向。
所以现在,当我们执⾏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请求的重定向。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。