重定向和转发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重定向和转发相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

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

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

用 curl 命令来测试:

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

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

转发和重定向的区别

转发和重定向的区别
重定向response.sendRedirect(request.getContextPath() + "success.jsp");// 重定向要加上项目名
转发:request.getRequestDispatcher("success.jsp").forward(request,response);
1.转发在服务器端完成的;重定向是在客户端完成的
2.转发的速度快;重定向速度慢
3.转发的是同一次请求;重定向是两次不同请求
4.转发不会执行转发后的代码;重定向会执行重定向之后的代码
5.转发地址栏没有变化;重定向地址栏有变化
6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

以上是关于重定向和转发的主要内容,如果未能解决你的问题,请参考以下文章

java中转发和重定向的区别

请问重定向与请求转发有啥区别?

转发和重定向的区别

转发和重定向

转发和重定向的区别

转发和重定向的区别