zoukankan      html  css  js  c++  java
  • 转发(forward)和重定向(sendRedirect)

    一. RequestDispatche

    是一个Web资源的包装器,可以用来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中。详细来说:RequestDispatch对象从客户端获取请求request,并把他们传递到服务器上的servlet、html、jsp。

    有两个方法,include()/forward()

    1. include()

    • void include(ServletRequest request,ServletResponse response) 
    • 用来记录保留request和response,以后不能再修改response里表示状态的信息。 

    2. forward() 转向

    void forward(ServletRequest request,ServletResponse response) 

    // 1. 跳转到指定的页面“dealWith.jsp”;
    String url = "dealWith.jsp";
    
    //2. 获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置
    RequestDispatcher requestDispatcher = request.getRequestDispatcher(url); 
    
    // 3. 执行跳转,将参数request和response传递给这个页面 
    requestDispatcher.forward(request, response);

    二.重定向的两种方法比较:forward & sendRedirect

    1. HttpServletResponse.sendRedirect(location)

    1)作用:该方法将相应定向到参数location指定的新的URL。

    2)location:可以是绝对地址,也可以是相对URL。

    注意:Redirect能够防止某些情况下客户端Refresh造成的一些未知后果(例如连续删除)

    2. forward & sendRedirect 比较

      本质  地址栏显示 数据共享 运用地方 效率 工作流程
    forward 服务器请求资源,服务器直接访问目标地址的URL,读取该URL的相应内容,然后把这些内容再发给服务器 不变(转发路径必须是同一个web容器下的URL 转发页面和转发到的页面可以共享request里面的数据. 一般用于用户登陆的时候,根据角色转发到相应的模块.

    一次请求

    sendRedirect 客户端行为,服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址 新的URL(Location可以是任意地址 不能共享 一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 至少两次请求

     

     

     

    其中两个动作的工作流程:

    1. 转发过程(forward)

    客户浏览器发送Http请求——>web服务器接受该请求——>调用内部的一个方法在容器内完成请求处理和转发动作——>将目标资源发送给客户

    上面直接转发请求的过程:

    1)浏览器向Servlet1发出请求

    2)Servlet1调用forward()方法,在服务器端将请求转发给Servlet2

    3)最终由Servlet2做出相应

    举例:A向B借钱,B没有钱,向C借钱,借没有借到钱都会将消息回复给A

    • 在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,
    • 中间传递的是自己的容器内的request。
    • 在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。 

    2. 重定向过程(sendRedirect)

    客户浏览器发送Http请求——>web服务器接受此请求后,发送302响应码以及新的location给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的Http请求,请求url是新的location地址——>服务器根据此请求寻找资源发送给客户。

    具体而言:

    1)浏览器向Servlet1发出访问请求

    2)Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2

    3)浏览器向Servlet2发出请求

    4)最终由Servlet2做出相应

    举例:它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。

    A向B借钱,B没有钱让A向C借钱。

    • 在这里 location可以重定向到任意URL
    • 既然是浏览器重新发出了请求,则就没有什么request传递的概念了。
    • 在客户浏览器路径栏显示的是其重定向的 路径,客户可以观察到地址的变化的。
    • 重定向行为是浏览器做了至少两次的访问请求的。 
  • 相关阅读:
    乱码解决
    Collection接口
    YTU EDG Vince Day Training -- 训练赛赛后总结
    Codeforces Round #751 (Div. 2) A. Two Subsequences
    Codeforces Round #750 (Div. 2) C. Grandma Capa Knits a Scarf
    Codeforces Round #745 (Div. 2) B. Diameter of Graph
    Codeforces Round #745 (Div. 2) A. CQXYM Count Permutations
    ytuoj-3328 快速幂
    Codeforces Round #746 (Div. 2) C. Bakry and Partitioning
    Codeforces Round #747 (Div. 2) B. Special Numbers
  • 原文地址:https://www.cnblogs.com/lesleysbw/p/6246546.html
Copyright © 2011-2022 走看看