Spring MVC建立在Servlet
API之上。因此,
HttpServletResponse理论上可以访问的任何组件都可以使用它
sendRedirect(String)手动设置或设置响应代码。(我说的是
理论上的 原因,因为在进行这些调用时还必须尚未做出响应。)
通常,在Spring MVC应用程序中,a
@Controller可以将方法中的
HttpServletResponse(或
ServletResponse)
@RequestMapping作为参数接收。
HandlerInterceptor在
DispatcherServlet的请求处理生命周期中,A
收到了三次。
任何已注册的Servlet
Filter实例都可以访问
ServletResponseSpring的(之前和之后),
DispatcherServlet因为过滤器在Servlet之前起作用。
Spring尝试将所有这些依赖项隐藏到Servlet
API中,以简化Web服务器的编程。因此,它提供了导致重定向的其他方法。这些主要取决于支持的处理程序方法的返回类型。更具体地讲,我们关心的
String,
View,
ModelAndView,和
ResponseEntity。
以下是所有默认情况:
当返回a时
String,Spring将使用a
ViewResolver来
View基于
String值解析a ,该值标识视图的名称。Spring
UrlbasedViewResolver会在视图名称中检测到
redirect:前缀,
String并将其视为发送重定向响应的指示。它将创建一个
RedirectView(实际上是在其中完成了一部分
ViewNameMethodReturnValueHandler,但
UrlbasedViewResolver创建了
View),它将负责使用进行重定向
HttpServletResponse。
这是一个实现细节,但是大多数Spring的默认
ViewResolver类都这样做。
使用
View,您可以轻松创建并返回
RedirectView自己。您也可以实现自己的
View类,该类将执行相同的操作。Spring将使用适当的方式
HandlerMethodReturnValueHandler来处理它。
使用
ModelAndView,它是前两个选项的混合,因为您可以提供视图名称或
View本身。
有了
ResponseEntity它,您可以控制整个响应,因此变得更加有趣。也就是说,您可以设置状态代码,标题,正文等所有内容。因此,您所需要做的就是将状态代码设置为302,并放置一个
Location带有URL
的标头以重定向到。
最后,您在
@ExceptionHandler方法中具有相似的行为(具有相似的返回类型),也可以将它们与
@ResponseStatus手动混合并修改标头。
这些都是基本情况,但是由于Spring
MVC几乎可以完全自定义,因此还有其他组件需要注意。这是
HandlerMethodArgumentResolver,
HandlerMethodReturnValueHandler,
HandlerAdapter,
HandlerExceptionResolver和
ExceptionHandler等。请注意,您很少会使用这些功能,而Spring附带的功能几乎可以完成整个工作。



