springmvc请求转发和重定向(携带参数和不携带参数)

本文详细解析了SpringMVC中的请求转发和重定向机制,包括传统请求转发、不经过视图解析器的转发、经过视图解析器的转发以及重定向的多种实现方式,对比了它们之间的差异,特别关注参数传递和地址栏变化的特点。
请求转发的三种方式

SpringMVC请求转发区别于重定向,请求转发地址栏不会发生改变、只发送一次请求、能携带原有的参数,但只可以在同一个服务器中进行转发。

  1. 传统的请求转发

    @RequestMapping("/forwardCommon")
    public  forwardCommon(HttpServletRequest request,HttpServletResponse response){
      request.getServletDispatcher("/WEBINF/pages/success.jsp").forward(request,response);
    }
    
  2. SpringMVC中不经过视图解析器的请求转发

    @RequestMapping("/forwardView")
    public String forwardView(){
    	return "forward:/WEB_INF/pages/success.jsp";
    }
    
    @RequestMapping("/forwardView")
    public String forwardView(){
    	ModelAndView mv=new ModelAndView();
        mv.setViewName("forward:/WEB_INF/pages/success.jsp");
    }
    
  3. 请求转发经过视图解析器

    其实很多人并不知道经过视图解析器的路由转发也是请求转发

    @RequestMapping("/shopmanagement")
    private String shopManagement(Model model) {
    	return "shop/shopmanagement";
    }
    
    @RequestMapping("/shopmanagement")
    private ModelAndView shopManagement(Model model) {
    	ModelAndView mv=new ModelAndView();
        mv.setViewName("shop/shopmanagement");//也是请求转发,会经过视图解析器
        return mv;
    }
    

    上面的请求转发只要在浏览器地址栏中输入localhost:8080/o2o/shopadmin/shopmanagement?shopId=53,就可以访问shopmanagement.html这个页面,并且我们可以尝试在该页面中引入一个js文件,试图查看请求转发后的地址。

    $(function(){
    	var shopId=getQueryString("shopId");//获取url中的参数
    	var url=window.location.href;//获得请求url
    })
    function getQueryString(name){
    	var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)");
    	var r=window.location.search.substr(1).match(reg);
    	if(r!=null){
    		return decodeURIComponent(r[2]);
    	}
    	return null;
    }
    

在这里插入图片描述
我们可以发现请求转发后的地址和第一次请求的地址一样, 连地址后面携带的参数都一样。所以请求转发不仅可以在请求体中携带参数(POST请求),也可以在地址栏中携带参数(GET请求),最后都可以在转发后的页面中获得该参数的值。

重定向

传统的重定向请求地址会改变(两次请求)、不能传递参数,但是利用SpringMVC的重定向可以携带和传递参数。重定向相比于请求转发可以跨服,但是不能直接重定向访问WEB-INF下的资源(可重定向后再进行一次请求转发)。

  1. 传统的重定向

    @RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
    public void testredirect(HttpServletResponse response){  
        response.sendRedirect("/index");
    }
    
  2. SpringMVC中不带参数的重定向

    @RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
    public String testredirect(){  
        return "redirect:/index";
    }
    
    @RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
    public ModelAndView testredirect(){  
        ModelAndView mv=new ModelAndView();
        mv.setViewName("redirect:/index");
        return mv;
    }
    
  3. SpringMVC中带参数的重定向

    • redirectAttributes.addAttributie("prama",value); 这种方法相当于在重定向链接地址上追加传递的参数

      @RequestMapping("/test")
      private String shopList(RedirectAttributes ra) {
      	ra.addAttribute("param", 1);
      	return "redirect:/shopadmin/shoplist";
      }
      
      //相当于请求 http://localhost:8080/o2o/shopadmin/shoplist?param=1
      
    • redirectAttributes.addFlashAttributie("prama",value); 这种方法是隐藏了参数,链接地址上不直接暴露,用(@ModelAttribute(value = "prama")String prama)的方式获取参数。

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

      接收参数

      @RequestMapping("/shoplist")
      private String shopList(@ModelAttribute("param") String param) {
      	System.out.println(param);//输出1
      	return "shop/shoplist";
      }
      
<think>首先,用户的问题是:“我想理解Spring MVC中的转发重定向机制 请问Spring MVC 转发重定向的区别及使用方法”。我需要基于系统级指令回答。 系统级指令: - 所有行内数学表达式必须使用$...$格式。但在这个主题中,可能没有数学表达式,所以我可以忽略。 - 独立公式必须使用$$...$$格式并单独成段。同样,可能适用。 - LaTeX语法正确。确保任何公式正确。 - 使用中文回答。 - 生成相关问题。在回答结束时,添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - 引用[1]:关于请求转发重定向在Spring MVC中的实现。 - 引用[2]:重定向可以携带参数,但能访问WEB-INF资源。 - 引用[3]:转发重定向的代码示例。 - 引用[4]:转发重定向的代码示例。 我需要整合这些信息,构建一个清晰的回答。 主题:Spring MVC中的转发重定向机制。 关键点: 1. **定义**: - 转发Forward):服务器内部将请求从一个资源转发到另一个资源,客户端知情。URL变。 - 重定向(Redirect):服务器告诉客户端去请求另一个URL,客户端发起新请求。URL改变。 2. **区别**: - URL变化:转发改变URL,重定向改变URL。 - 请求次数:转发一次请求重定向两次请求(客户端-服务器-客户端-新URL)。 - 参数传递:在转发中,请求参数自动传递;在重定向中,需要手动传递参数(如通过URL参数或Flash属性)。 - 资源访问:转发可以访问WEB-INF下的资源(如JSP),重定向能直接访问WEB-INF资源。 - 跨域:转发限于同一服务器上下文,重定向可以跨域(到同服务器)。 3. **在Spring MVC中的使用方法**: - 默认情况下,控制器方法的return语句是转发到视图。 - 例如:`return "viewName";` 会转发到对应的视图(如JSP)。 - 实现转发: - 使用`forward:`前缀。例如:`return "forward:/path";` - 实现重定向: - 使用`redirect:`前缀。例如:`return "redirect:/path";` - 传递参数: - 转发参数自动在请求中传递。 - 重定向:可以使用`RedirectAttributes`来添加参数,这些参数会作为URL参数传递。 4. **代码示例**: - 基于引用: - 引用[3]:`return "test2";` 是转发到视图test2。 - `return "redirect:/hello.jsp";` 是重定向。 - 引用[4]:`return "forward:/user/find.action";` 或 `return "redirect:/user/find.action";` 5. **注意事项**: - 重定向时,能直接重定向到WEB-INF下的资源,因为客户端能直接访问这些资源。 - 使用`RedirectAttributes`可以避免在URL中暴露敏感数据。 回答结构: 1. **介绍**:简要解释转发重定向。 2. **区别**:列表形式对比。 3. **使用方法**:如何在Spring MVC中实现,包括代码示例。 4. **注意事项**:关键点提醒。 5. **相关问题**:结束时生成相关问题。 最后,添加引用标识。引用来自提供的引用内容。 相关问题生成: - 基于主题,如优化、性能、应用场景等。 - 例如: 1. Spring MVC中如何传递参数重定向时? 2. 转发重定向在性能上有什么差异? 3. 在什么场景下应该使用转发重定向? 4. 如何处理重定向时的数据丢失问题? 确保回答用中文。</think>### Spring MVC 中的转发重定向机制详解 在 Spring MVC 框架中,**转发Forward)** **重定向(Redirect)** 是两种常见的请求处理机制,用于控制页面跳转资源访问。它们基于 HTTP 协议,但在实现方式、行为特性使用场景上有显著区别。下面我将逐步解释它们的区别及使用方法,确保内容清晰可靠。 --- #### 一、转发重定向的基本区别 转发重定向的核心差异在于请求处理流程客户端行为: - **转发Forward)**: - **定义**:服务器内部将请求从一个资源(如控制器方法)转发到另一个资源(如视图或其他控制器),客户端(浏览器)感知到变化。URL 地址栏保持变。 - **请求次数**:仅一次请求(客户端→服务器→内部转发→响应)。 - **参数传递**:请求参数(如 `HttpServletRequest` 中的属性)自动传递,无需额外处理。 - **资源访问**:可直接访问 WEB-INF 目录下的受保护资源(如 JSP 文件),因为转发在服务器端完成。 - **适用场景**:适用于同一应用内的页面跳转,例如表单提交后显示结果页。 - **重定向(Redirect)**: - **定义**:服务器告诉客户端重新发起一个新请求到指定 URL,客户端会收到 302 状态码并跳转。URL 地址栏改变为新地址。 - **请求次数**:两次请求(客户端→服务器→响应 302→客户端→新 URL→服务器→响应)。 - **参数传递**:默认自动传递参数,需手动通过 URL 参数或 `RedirectAttributes` 传递。Spring MVC 支持携带参数,但需注意 URL 长度限制。 - **资源访问**:**能直接访问 WEB-INF 下的资源**(如 JSP),因为客户端无法直接请求这些受保护路径。但可通过重定向到控制器再转发间接实现。 - **适用场景**:适用于跨应用跳转、防止表单重复提交,或需更新 URL 的场景(如登录后跳转主页)。 **关键区别总结**: | 特性 | 转发Forward) | 重定向(Redirect) | |--------------|--------------------------------|----------------------------------| | URL 变化 | 变 | 改变 | | 请求次数 | 一次 | 两次 | | 参数传递 | 自动 | 手动(需 `RedirectAttributes`) | | 资源访问 | 可访问 WEB-INF 资源 | 可直接访问 WEB-INF 资源 | | 跨域支持 | 仅限同一服务器上下文 | 支持跨域(如同域名) | | 性能影响 | 较低(单次请求) | 较高(两次请求) | 在 Spring MVC 中,控制器方法的 `return` 语句默认是转发实现(如返回视图名),而重定向需显式添加 `redirect:` 前缀[^1][^3]。 --- #### 二、在 Spring MVC 中的使用方法 Spring MVC 通过控制器方法的返回值实现转发重定向,语法简洁。以下是详细代码示例: ##### 1. **转发Forward)的实现** - **默认行为**:控制器方法返回字符串时,Spring MVC 自动转发到对应视图(如 JSP)。 - **显式转发**:使用 `forward:` 前缀指定目标路径。 - **示例代码**: ```java @Controller @RequestMapping("/user") public class UserController { // 默认转发到视图:return "viewName" 会转发到 /WEB-INF/views/success.jsp @RequestMapping("/defaultForward") public String defaultForward(Model model) { model.addAttribute("msg", "这是默认转发"); return "success"; // 转发到视图 success.jsp(视图解析器配置决定路径) } // 显式转发到另一个控制器方法 @RequestMapping("/explicitForward") public String explicitForward() { // 转发到 /user/find 路径的处理方法 return "forward:/user/find"; } // 目标方法(被转发的资源) @RequestMapping("/find") public String find(Model model) { model.addAttribute("result", "查询成功"); return "result"; // 最终转发到 result.jsp } } ``` - **说明**:转发时,请求参数(如 `model` 中的属性)自动传递,无需额外代码。URL 保持为原始请求(如 `/user/explicitForward`)[^1][^4]。 ##### 2. **重定向(Redirect)的实现** - **基本重定向**:使用 `redirect:` 前缀指定目标 URL。 - **参数传递**:通过 `RedirectAttributes` 对象添加参数,避免 URL 暴露敏感数据。 - **示例代码**: ```java @Controller @RequestMapping("/user") public class UserController { // 基本重定向到静态页面(可访问 WEB-INF) @RequestMapping("/basicRedirect") public String basicRedirect() { // 重定向到 /hello.jsp(需确保该文件在 webapp 根目录,非 WEB-INF 下) return "redirect:/hello.jsp"; } // 重定向到控制器方法,并传递参数 @RequestMapping("/redirectWithParams") public String redirectWithParams(RedirectAttributes attributes) { attributes.addAttribute("id", 123); // 添加 URL 参数(如 /user/find?id=123) attributes.addFlashAttribute("message", "临时数据"); // 使用 Flash 属性(仅一次请求有效) return "redirect:/user/find"; } // 目标方法(处理重定向请求) @RequestMapping("/find") public String find(@RequestParam int id, Model model) { model.addAttribute("user", "用户ID: " + id); return "userDetails"; // 转发到视图 } } ``` - **说明**: - 重定向时,`addAttribute` 会将参数附加到 URL(如 `redirect:/user/find?id=123`),而 `addFlashAttribute` 通过 session 临时存储数据,避免 URL 暴露。 - 重定向能直接访问 `/WEB-INF/views/userDetails.jsp`,但可通过重定向到控制器再转发解决[^2][^3][^4]。 ##### 3. **关键注意事项** - **性能与安全**:转发效率更高(单次请求),但重定向更安全(防止表单重复提交)。重定向时,避免在 URL 中传递敏感参数(如密码),优先用 `RedirectAttributes`。 - **WEB-INF 资源处理**:如需重定向后访问受保护资源,可设计控制器链:`重定向→控制器方法→转发到 WEB-INF 视图`。 - **默认行为**:Spring MVC 中,`return "viewName"` 是转发,`return "redirect:url"` 是重定向。无需额外配置[^1][^3]。 --- #### 三、何时选择转发重定向? - **用转发**:当需要保持 URL 变、传递复杂数据或访问 WEB-INF 资源时(如内部页面跳转)。 - **用重定向**:当需要更新 URL(如 POST-Redirect-GET 模式)、跨应用跳转或防止浏览器回退导致重复提交时。 通过合理选择,可以提升应用的用户体验安全性。例如,登录后重定向到主页可避免刷新时重复提交表单[^2][^4]。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值