SpringMVC请求转发与重定向详解及参数传递方法

叶初
叶初
发布时间:2026-10-15 | 4人浏览过
原创

掌握SpringMVC中请求转发(Forward)与重定向(Redirect)的本质差异是实现Web应用跳转逻辑的关键。本文对比两种方式的地址栏变化、请求次数及作用域限制,并详细解析如何使用RedirectAttributes工具类安全地携带参数进行跨请求数据传输。

请求转发的核心特性与实现

请求转发是服务器内部行为,浏览器只发起一次HTTP请求。其显著特征是地址栏URL保持不变,且能够共享同一个Request上下文中的对象和参数。但由于位于服务器内部,转发目标通常限制在同一服务器应用内。

第1步:使用原生Servlet API实现传统转发

这是最基础的转发方式,直接操作HttpServletRequest和HttpServletResponse对象,不经过Spring MVC视图解析器。

@RequestMapping("/forwardCommon")
public void forwardCommon(HttpServletRequest request, HttpServletResponse response) {
    try {
        // 注意路径写法,WEB-INF下资源需通过此方式访问
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

第2步:返回字符串前缀实现无视图解析器转发

在Controller中直接返回以forward:开头的字符串。这种方式同样跳过视图解析器,适合直接指向JSP文件或静态资源。

@RequestMapping("/forwardView")
public String forwardView() {
    return "forward:/WEB-INF/pages/success.jsp";
}

或者使用ModelAndView方式:

@RequestMapping("/forwardView")
public ModelAndView forwardView() {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("forward:/WEB-INF/pages/success.jsp");
    return mv;
}

第3步:经过视图解析器的路由转发

大多数情况下,我们返回的逻辑视图名称会被视图解析器处理。只要返回值不以redirect:开头,SpringMVC默认将其视为请求转发,最终由视图解析器拼接前后缀生成物理路径。

@RequestMapping("/shopmanagement")
private String shopManagement(Model model) {
    // 假设prefix=/WEB-INF/pages/, suffix=.jsp
    // 实际转发到 /WEB-INF/pages/shop/shopmanagement.jsp
    return "shop/shopmanagement";
}
@RequestMapping("/shopmanagement")
private ModelAndView shopManagement(Model model) {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("shop/shopmanagement"); // 经过视图解析器,本质仍是转发
    return mv;
}

参数携带验证:请求转发允许在URL中携带GET参数或在请求体中携带POST参数,转发后的页面可以通过相同方式获取这些参数值。例如,在success.jsp中可通过EL表达式或JavaScript获取shopId:

从图中可见,无论原始请求是否携带参数,转发后地址栏显示的路径和参数均保持一致,证明了请求上下文的连续性。

重定向的特性与跨服能力

重定向会向浏览器发送302状态码,浏览器随后发起第二次请求。这导致地址栏URL改变,且两次请求之间Request上下文隔离。虽然不能直接传递Request属性,但重定向优势在于支持跨服务器跳转,且能规避直接访问WEB-INF受限目录的问题(先重定向到外部,再转发或正常访问)。

第1步:原生Servlet API的传统重定向

不经过Spring MVC框架,直接调用响应对象的方法。

@RequestMapping(value="/testredirect", method = {RequestMethod.POST, RequestMethod.GET})
public void testredirect(HttpServletResponse response) throws IOException {
    response.sendRedirect("/index");
}

第2步:基于字符串的前缀重定向

通过返回以redirect:开头的字符串实现框架内重定向。

@RequestMapping(value="/testredirect", method = {RequestMethod.POST, RequestMethod.GET})
public String testredirect() {
    return "redirect:/index";
}

或使用ModelAndView:

@RequestMapping(value="/testredirect", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView testredirect() {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("redirect:/index");
    return mv;
}

SpringMVC中携带参数的重定向方案

由于重定向切断了Request上下文,传统方式无法直接传递模型数据。SpringMVC提供了RedirectAttributes接口来解决这一问题,主要有两种策略:

第1步:使用 addAttribute 暴露参数

该方法将参数追加到重定向后的URL后面,类似GET请求。优点是兼容性好,缺点是URL长度受限且参数对用户可见,不适合敏感数据。

@RequestMapping("/test")
private String shopList(RedirectAttributes ra) {
    // 参数将追加到URL: ?param=1
    ra.addAttribute("param", "1");
    return "redirect:/shopadmin/shoplist";
}
// 实际跳转至: http://localhost:8080/o2o/shopadmin/shoplist?param=1

第2步:使用 addFlashAttribute 隐藏参数

该方法利用Session机制临时存储数据,并在下一次请求结束后自动清除。参数不会出现在URL中,安全性更高,适用于表单提交后重定向以防止重复提交场景。

@RequestMapping("/test")
private String shopList(RedirectAttributes ra) {
    ra.addFlashAttribute("param", "value");
    return "redirect:/shopadmin/shoplist";
}

接收隐藏参数:目标控制器需要配合@ModelAttribute注解来接收Flash属性。框架会自动从Session中提取数据绑定到方法参数或Model中。

@RequestMapping("/shoplist")
private String shopList(@ModelAttribute("param") String param) {
    System.out.println(param); // 输出 value
    return "shop/shoplist";
}

以上就是SpringMVC请求转发和重定向的详细对比及参数传递解决方案,更多关于Web后端开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表