重定向和转向的写法,重定向以post方式提交

博客提及重定向的第三种方式,内容转载自https://www.cnblogs.com/MSNS-MTT/p/11057819.html ,涉及Java、JavaScript和测试相关信息技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 


重转向保留跳转过来的Referer,路径不会变
1
request.getRequestDispatcher("/eventweb/index.sp?loginId=" + loginId).forward(request, response);

重定向的 第一种方式         

PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<script>"); out.println("window.open ('" + request.getContextPath() + "/eventweb/declare.sp?loginId=" + loginId + "','_top')"); out.println("</script>"); out.println("</html>")



重定向的 第二种方式,跳转时以post方式提交(如果get会展示携带的参数,不安全)

1
RedirectWithPost redirectWithPost = new RedirectWithPost(response); 2 String redirectUrl = request.getContextPath() + "/eventweb/declare.sp"; 3 redirectWithPost.setParameter("loginId", loginId); 4 redirectWithPost.sendByPost(redirectUrl);

/**
 * 用POST方式 重定向
 *
 * @author royFly
 */
public class RedirectWithPost {
    Map<String, String> parameter = new HashMap<String, String>();
    HttpServletResponse response;

    public RedirectWithPost(HttpServletResponse response) {
        this.response = response;
    }

    public void setParameter(String key, String value) {
        this.parameter.put(key, value);
    }

    public void sendByPost(String url) throws IOException {
        this.response.setContentType("text/html");
        PrintWriter out = this.response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println(" <HEAD>");
        out.println(" <meta http-equiv=Content-Type content=\"text/html; charset=utf-8\">");
        out.println(" <TITLE>loading</TITLE>");
        out.println(" <meta http-equiv=\"Content-Type\" content=\"text/html charset=GBK\">\n");
        out.println(" </HEAD>");
        out.println(" <BODY>");
        out.println("<form name=\"submitForm\" action=\"" + url + "\" method=\"post\">");
        Iterator<String> it = this.parameter.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            out.println("<input type=\"hidden\" name=\"" + key + "\" value=\"" + this.parameter.get(key) + "\"/>");
        }
        out.println("</from>");
        out.println("<script>window.document.submitForm.submit();</script> ");
        out.println(" </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

重定向的 第三种方式

sendRedirect(request, response, url, true);

转载于:https://www.cnblogs.com/MSNS-MTT/p/11057819.html

<think>我们参考了用户提供的四个引用,特别是引用[1][2][3]详细说明了请求转发响应重定向的区别。根据这些引用,我们可以总结出以下几点关键区别:1.**请求转发(Forward)**:-语法:在SpringMVC中可以通过`return"forward:xxx";`或者原生Servlet中使用`request.getRequestDispatcher("").forward(request,response);`-特点:-是服务器内部行为,对客户端透明,客户端只发送了一次请求。-客户端地址栏的URL不会改变。-在整个过程中,只有一个请求响应对象,因此请求参数请求域(requestscope)中的数据可以传递给转发的资源。-可以转发到其他Servlet、JSP等动态资源,也可以转发到静态资源(如HTML页面),还可以转发到WEB-INF目录下的受保护资源。-不能转发到当前Web应用程序之外的外部资源。2.**响应重定向(Redirect)**:-语法:在SpringMVC中可以通过`return"redirect:xxx";`或者原生Servlet中使用`response.sendRedirect("");`-特点:-是客户端行为,服务器告诉客户端重新发送一个新的请求到指定的URL。-客户端地址栏的URL会变为新的URL。-因为客户端发送了两次请求,所以是两个不同的请求响应对象。因此,原始请求中的参数请求域数据在重定向后的请求中不可用,但可以通过URL参数(querystring)或会话(session)来传递数据。-不能重定向到WEB-INF目录下的受保护资源(因为客户端不能直接访问WEB-INF下的资源)。-可以重定向到当前应用程序的其他资源,也可以重定向到外部资源(其他网站或应用程序)。作用:-请求转发:适用于在服务器内部传递控制权,比如在一个请求中需要多个Servlet协同完成工作,或者需要访问受保护资源(如WEB-INF下的资源),同时保持请求的连续性。-响应重定向:适用于需要避免表单重复提交的场景(PRG模式:Post/Redirect/Get),或者需要跳转到其他站点,以及当需要改变客户端URL显示的时候(例如登录后跳转)。此外,引用[4]提到了一些路径写法的问题,特别是重定向时可能会出现两个项目名的情况,这通常是因为重定向时使用了绝对路径(以`/`开头)且未正确设置上下文路径。重定向的路径需要由客户端重新请求,所以需要完整的URL(或相对于服务器根的绝对路径),而转发使用的是相对于当前应用上下文的路径(因为是在服务器内部)。总结表格:|特性|请求转发(Forward)|响应重定向(Redirect)||----------------------|----------------------------------------|------------------------------------------||**实现方式**|`forward:xxx`或`RequestDispatcher`|`redirect:xxx`或`sendRedirect`||**客户端感知**|透明,一次请求|显式,两次请求||**地址栏变化**|不变|改变||**数据传递**|请求参数、属性在转发过程中保留|原始请求数据丢失,需重新传递或使用会话||**目标资源**|只能访问当前应用内资源(包括WEB-INF)|可以访问当前应用内资源(除WEB-INF),也可访问外部资源||**性能**|相对较高(无二次请求)|相对较低(有二次请求)||**应用场景**|服务器内部传递控制权|避免表单重复提交,跳转外部站点,改变URL|注意事项:重定向由于需要客户端再次发起请求,所以会多一次网络往返,因此效率上比请求转发低。另外,重定向时如果使用了绝对路径(以`/`开头),则要注意加上应用上下文路径(contextpath),否则可能会丢失上下文路径导致404错误。在Servlet中,可以使用`response.sendRedirect(request.getContextPath()+"/targetUrl");`来避免这个问题。根据以上总结,我们可以清晰地回答用户关于响应重定向请求转发的区别及作用的问题。</think> ### 响应重定向与请求转发的区别及作用分析 #### 一、本质区别 1. **请求转发 (Forward)** - 语法:`request.getRequestDispatcher("path").forward(request, response);` - 特点: - 服务器内部跳转(客户端无感知) - **单次请求**:地址栏URL不变(浏览器只发出1次请求)[^3] - 共享**同一个Request对象**(可传递请求参数域属性)[^2] - 可访问**WEB-INF受保护资源**(如服务器配置文件)[^2][^4] ```java // Spring MVC示例 return "forward:/protected/userInfo"; ``` 2. **响应重定向 (Redirect)** - 语法:`response.sendRedirect("url");` - 特点: - 客户端跳转(浏览器执行新请求) - **两次请求**:地址栏显示新URL(浏览器发出2次HTTP请求)[^3] - **新建Request对象**(请求参数需重新传递)[^3] - 无法直接访问WEB-INF资源[^4] ```java // Spring MVC示例 return "redirect:/public/login"; ``` #### 二、核心差异对比 | **特性** | 请求转发 | 响应重定向 | |------------------|--------------------------|--------------------------| | 请求次数 | 1次 | 2次 | | 地址栏变化 | ❌ 不变 | ✅ 变为新URL | | 数据传递 | ✅ 自动携带请求参数/域属性 | ❌ 需手动传参 | | 目标资源限制 | ❌ 可访问WEB-INF | ✅ 不可访问WEB-INF | | 跨应用跳转 | ❌ 不支持 | ✅ 支持 | | 性能消耗 | 较低(无额外网络往返) | 较高(多一次HTTP请求) | #### 三、核心作用场景 1. **请求转发适用场景** - 需要保持请求状态(如表单分步骤提交)[^2] - 访问服务器受保护资源(WEB-INF目录) - 需要多个组件协作处理请求(控制器→服务层→视图) - 隐藏实际资源路径增强安全性 2. **响应重定向适用场景** - 避免表单重复提交POST-REDIRECT-GET模式) - 需改变地址栏URL(如登录后跳转首页) - 跨应用跳转(如支付完成后跳回商家) - 需要清除原始请求参数的安全场景 > **典型案例**:用户登录流程 > 1. 提交登录表单(POST请求) > 2. 验证成功后重定向到主页(防止刷新导致重复提交) > 3. 主页通过请求转发加载用户数据(保持登录状态)[^3] #### 四、常见问题解决 1. **路径丢失问题** - 重定向时推荐使用绝对路径: ```java response.sendRedirect(request.getContextPath() + "/target.jsp"); ``` - 避免出现双项目名(如`/appName/appName/resource`)[^4] 2. **数据传递方案** ```java // 重定向时通过Session临时传参 request.getSession().setAttribute("tempData", value); response.sendRedirect("target"); // 在新请求中立即移除Session数据 ``` --- 📚 **引用标注** [^1]: 请求转发语法通过`forward:xxx`实现,重定向通过`redirect:xxx`实现 [^2]: 请求转发是服务器内部行为,全程使用同一Request对象 [^3]: 重定向导致客户端发送两次请求,地址栏显示新URL [^4]: WEB-INF资源只能通过请求转发访问,重定向无法穿透保护层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值