详细聊聊Spring MVC重定向与转发

目录
  • 重定向和转发
    • 常用处理方式
      • String 重定向
      • ModelAndView 重定向
    • RedirectView 重定向
    • 带参跳转
  • redirect 和 forward 的区别
  • 附:请求转发与重定向的区别图例
  • 总结

重定向和转发

重定向经过客户端,而转发没有,因此相对来说转发更快速。但有时采用重定向更方便,如:

  1. 重定向到外部网站;
  2. 避免用户重新加载页面时再次调用同样的动作。
return "redirect:/view/"+saveUser.getId();

这里使用重定向来防止当前用户重新加载页面时'''saveUser'''被二次调用。

但是使用重定向无法轻松地给目标页面传值,因此,在Spring3.1后提供了Flash属性,详情见后文。

常用处理方式

Controller 视图方法间的跳转,无非就是带参跳转和不带参跳转。常用的方法有通过 String 映射 RequestMapping 实现重定向,或者通过 ModelAndView 对象,又或者是 RedirectView 对象,下面逐一说明。

String 重定向

是 return 映射到另一个 Controller 方法的字符串。如果有请求参数,就拼接在 RequestMapping 映射的字符串后面。

// 返回字符串映射的方式
@RequestMapping("hello")
public String hello(HttpServletRequest req, HttpServletResponse resp) {
    doSomething();
    return "redirect:/bye";
    // return "redirect:/bye?username=sudoz";
}

ModelAndView 重定向

另一种方法是通过返回 ModelAndView 对象来实现跳转。类似的,如果有请求参数,也可以通过类似 GET 参数拼接的方式:

// 返回 ModelAndView 对象
@RequestMapping("hello")
public ModelAndView hello(HttpServletRequest req, HttpServletResponse resp) {
    doSomething();
    return new ModelAndView("redirect:/bye");
    // return new ModelAndView("redirect:/bye?username=sudoz");
}

RedirectView 重定向

还有一种方法是通过返回 RedirectView 对象实现跳转,该方法和上面的不同之处在于,RedirectView 对象不需要设置 redirect 前缀:

// 返回 RedirectView 对象
@RequestMapping("hello")
public RedirectView hello() {
    doSomething();
    return new RedirectView("/bye");
    // return new RedirectView("bye?username=sudoz");
}

带参跳转

Model在重定向时会丢失携带的消息

在做方法跳转时,如果要把参数带给下一个方法,像上面代码里通过拼接 URL 参数的方法有时候并不实用。因为参数不一定都是是字符串,而且浏览器对 URL 的长度是有限制的。RedirectAttributes 对象可以用来保存请求重定向时的参数。利用 RedirectAttributes 改写上面的代码:

@RequestMapping("/")
public RedirectView hello(RedirectAttributes attrs) {
    attrs.addAttribute("message", "hello");
    attrs.addFlashAttribute("username", "world");
    return new RedirectView("hello");
}

@RequestMapping("hello")
    Map<String, String> hello(@ModelAttribute("message") String meaasge,
                              @ModelAttribute("username") String username) {
    Map<String, String> map = new HashMap();
    map.put("message", message);
    map.put("username", username);
    return map;
}

上面的代码中,调用 addAttribute() 和 addFlashAttribute() 方法往 RedirectAttributes 对象中插入了两个值,如果看源码,就能知道,RedirectAttributes 接口的实现类 RedirectAttributesModelMap 继承了 ModelMap,本质上就是 HashMap 的子类,因此可以用来存储 Key-Value 对。这两个方法都很常用,使用上也必然存在不同:

  • addAttribute() 方法会把 Key-Value 作为请求参数添加的 URL 的后面;
  • addFlashAttribute() 方法会把 Key-Value 暂存在 session 中,在跳转到目标方法后,即完成任务,会从 session 中删掉;

用 curl 命令来测试:

curl -i http://localhost:8080/

HTTP/1.1 302
Set-Cookie: JSESSIONID=D1CC5E15FA8EF9474C4CED7D4F660E66;path=/;HttpOnly
Location: http://localhost:8080/hello;jsessionid=D1CC5E15FA8EF9474C4CED7D4F660E66?username=sudoz
Content-Language: en-US
Content-Length: 0
Date: Thu, 16 Feb 2017 12:33:46 GMT

可以看到,通过 addAttribute() 添加的键值对变成了 URL 后面的参数,addFlashAttribute() 方法添加的键值对则没有出现在 URL 上,而是存储在了 session 中。跳转的目标方法通过 @ModelAttribute("key")注解指定接收的参数。

redirect 和 forward 的区别

上面列出的 3 种方法,其实都是 Spring MVC 在处理请求时的重定向,即 redirect 跳转。另一种分发请求的方式是转发,即 forward。二者的区别从 HTTP 的规范中就明确:

  • redirect 的 HTTP 返回码是 302,且跳转的新 URL 会存储在 HTTP Response Headers 的 Location 字段中。客户端在接收到 Response 后,会发起另一次请求,这次请求的 URL 就是重定向的 URL;
  • forward 的转发过程只发生在服务端;Servlet 容器会直接把源请求打向目标 URL,而不会经由客户端发起请求;因此客户端接收到的响应是来自转发后的目标方法,但是浏览器呈现的 URL 却并不会改变,且 forward 不能将参数转发出去。

附:请求转发与重定向的区别图例

总结

到此这篇关于Spring MVC重定向与转发的文章就介绍到这了,更多相关Spring MVC重定向与转发内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springmvc中的转发重定向和拦截器的示例

    本文介绍了Springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下: 可变参数在设计方法时,使用 数据类型... 来声明参数类型,例如: public static void function(int... numbers) 在实现方法体时,可变参数是作为数组来处理 public class Test{ public static void main(String[] args){ System.out.println(Test.sum(1,2,3)); System.out.pri

  • SpringMVC中转发与重定向的区别浅析

    转发和重定向 相同点 都是web开发中资源跳转的方式. 不同点 转发:是服务器内部的跳转,浏览器的地址栏不会发生变化.从一个页面到另一个页面的跳转还是同一个请求,也即是只有一个请求响应.可以通过request域来传递对象. 重定向:是浏览器自动发起对跳转目标的请求,浏览器的地址栏会发生变化.从一个页面到另一个页面的跳转是不同的请求,也即是有两个或两个以上的不同的请求的响应.无法通过request域来传递对象. 在SpringMVC中实现转发和重定向 (1)在SpringMVC中仍然以传统方式进行

  • 详解spring mvc 请求转发和重定向

    请求重定向与请求转发的比较,HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别. 1.RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件,HttpServletResponse.sendRedirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序的资源,甚至是使用绝对

  • 简单谈谈SpringMVC转发和重定向的区别

    在servlet中,转发和重定向是由request和response完成的.两者之间的区别请看我之前的文章.那么在springMVC中是如何完成的呢? /**转发**/ @RequestMapping("/login.do") public String login(HttpServletRequest request,HttpServletResponse response){ request.setAttribute("message", "hello

  • 详细聊聊Spring MVC重定向与转发

    目录 重定向和转发 常用处理方式 String 重定向 ModelAndView 重定向 RedirectView 重定向 带参跳转 redirect 和 forward 的区别 附:请求转发与重定向的区别图例 总结 重定向和转发 重定向经过客户端,而转发没有,因此相对来说转发更快速.但有时采用重定向更方便,如: 重定向到外部网站: 避免用户重新加载页面时再次调用同样的动作. return "redirect:/view/"+saveUser.getId(); 这里使用重定向来防止当前

  • Java 超详细讲解Spring MVC异常处理机制

    目录 异常处理机制流程图 异常处理的两种方式 简单异常处理器SimpleMappingExceptionResolver 自定义异常处理步骤 本章小结 异常处理机制流程图 系统中异常包括两类: 预期异常 通过捕获异常从而获取异常信息. 运行时异常RuntimeException 主要通过规范代码开发.测试等手段减少运行时异常的发生. 系统的Dao.Service.Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如

  • 聊聊Spring MVC JSON数据交互的问题

    我们在开发中后端经常需要接受来自于前端传递的Json字符串数据,怎么把Json字符串转换为Java对象呢?后端也经常需要给前端返回Json字符串,怎么把Java对象数据转换为Json字符串返回呢? 回顾JSON JSON(JavaScript Object Notation) 各个JSON技术比较 早期 JSON 的组装和解析都是通过手动编写代码来实现的,这种方式效率不高,所以后来有许多的关于组装和解析 JSON 格式信息的工具类出现,如 json-lib.Jackson.Gson 和 Fast

  • Spring MVC中使用Controller如何进行重定向

    目录 Controller如何进行重定向 本人知道的有两种方式 注意 具体看demo理解这两种方式的实现 controller请求转发,重定向 了解 转发forward 重定向redirect Controller如何进行重定向 Spring MVC中进行重定向 本人知道的有两种方式 方法返回的URI(相对路径)中加上"redirect:"前缀,声明要重定向到该地址 使用HttpServletResponse对象进行重定向 注意 "redirect:"后面跟着的是&

  • Spring MVC框架配置方法详解

    本文实例为大家分享了Spring MVC框架配置方法,供大家参考,具体内容如下 1.概述 Spring MVC 作用:用来实现前端浏览器与后面程序的交互 Spring MVC 是基于Spring 的MVC框架,所谓MVC(model,controller,view) ,整个Spring MVC 作用就是,基于Spring 将model(数据)在controller(后台程序) ,view(前端浏览器)之间交互 至于Spring MVC优点缺点,了解不深 不作评价, 2.引用的jar包 既然是基于

  • 教你使用idea搭建ssm详细教程(Spring+Spring Mvc+Mybatis)

    一.创建maven项目 我使用的是汉化的idea 可以选择原型,我这里没有选择 输入项目名称,完成创建 二.配置tomcat 选择运行编辑配置 点加号找见tomcat,点击确定 三.添加web模块 点击文件进入项目结构,选择模块 点加号找见web,点击确定 四.添加工件 点击加号添加,并将可用元素中的jar包,右击,加入lib中 五.为项目添加tomcat的jar包 选择模块,选择项目名 选择web服务 六.idea不会编译src下的mapper.xml文件 让idea编译器不忽略src下的ma

  • Spring MVC 与 CORS跨域的详细介绍

    1. CORS 简介 同源策略(same origin policy)是浏览器安全的基石.在同源策略的限制下,非同源的网站之间不能发送 ajax 请求的. 为了解决这个问题,w3c 提出了跨源资源共享,即 CORS(Cross-Origin Resource Sharing). CORS 做到了两点: 不破坏即有规则 服务器实现了 CORS 接口,就可以跨源通信 基于这两点,CORS 将请求分为两类:简单请求和非简单请求. 1.1 简单请求 可以先看下 CORS 出现前的情况:跨源时能够通过 s

  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    目录 1.创建Maven 2.Maven目录和porm.xml配置 3.配置Tomcat服务器 1.创建Maven 2.Maven目录和porm.xml配置 关于java和resources文件夹需要自己创建 这个时候我们看到的只是Maven的Web项目的目录和页面,并没有Spring MVC的东西.接下来我们要做的就是来到pom.xml,编写pom.xml导入Spring MVC所使用的包.注意,我们这里没有选择使用框架支持来导入Spring MVC的包,因为使用Maven来导入更能方便管理包

  • Spring MVC中处理ajax请求的跨域问题与注意事项详解

     前言 有时候前后台做数据交互,会遇到烦人的跨域请求问题,如果你还是一枚编程小白来说,无疑来说是很痛苦的事. 当然网上也肯定会有一些解决方法.但自身实力有限,不一定会看的懂,能把问题解决了.所以下面这篇文章就来给大家总结介绍在Spring MVC中处理ajax请求的跨域问题与一些注意事项,话不多说了,来一起看看详细的介绍吧. 为何跨域 简单的说即为浏览器限制访问A站点下的js代码对B站点下的url进行ajax请求.假如当前域名是www.abc.com,那么在当前环境中运行的js代码,出于安全考虑

  • Spring MVC 框架搭建配置方法及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.comm

随机推荐