重定向&转发

转发&重定向

重定向:向客户端发送一个指定URL的临时重定向的响应。

转发:将一个请求转到服务器的另一个资源。在处理完初步请求另外的资源之后生成响应。

定义基本说明转发操作为何可以保持request内的parameter,attribute这些值都可以保留,而重定向操作却会丢弃的原因:

  • 转发是在服务端完成的,并没有经过客户端
  • 转发整个操作完成后才生成响应
  • 重定向是服务端向客户端发送指定的URL
  • 重定向是在客户端完成的

容器实现:
在servlet内部一般对于这两者的使用形式也相当直观,例如对于hello.jsp的请求:

sendRedirct方法:

response.sendRedirect("/hello.jsp");

是服务端根据逻辑,发送一个状态码(302重定向),告诉浏览器重新去请求那个地址。地址栏显示的是新的URL。

forward方法:

request.getRequestDispatcher("/hello.jsp").forward(request, response);

在转发中浏览器发请求的时候是一个固定的URL,整个重定向是服务端内部进行的,浏览器并没有感知到,因此也不会显示出来。

区别

  1. 地址栏

    1. forward:服务器行为。

      服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器不知道服务器发送的内容从哪里来的,跳转过程是在服务器实现的,客户端不知道这个跳转动作,地址栏不变

    2. redirect:客户端行为。

      服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,地址栏显示的是新的URL

  2. 数据共享

    1. forward:转发页面和转发到的页面可以共享request里面的数据
    2. redirect:不能共享数据
  3. 使用场景

    1. forward:一般用于用户登陆的时候,根据角色转发到相应的模块
    2. redirect:一般用于用户注销登陆时,返回主页面和跳转到其它的网站等
  4. 效率

    1. forward:高
    2. redirect:低
  5. 重定向会显示真实路径,转发不会;

  6. 重定向之后,原来的request中的数据都丢掉,而转发却还是能保证request中的数据依然保留;

两个动作的工作流程:

转发:

  • 客户浏览器发送http请求

  • web服务器接受此请求

  • 调用内部的一个方法在容器内部完成请求处理和转发动作

  • 将目标资源发送给客户

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

转发行为是浏览器只做了一次访问请求

重定向:

  • 客户浏览器发送http请求
  • web服务器接受后发送302状态码响应及对应新的location给客户浏览器
  • 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址
  • 服务器根据此请求寻找资源并发送给客户

在这里 location 可以重定向到任意URL,既然是浏览器重新发出请求,则就没有什么request传递的概念。在客户浏览器路径栏显示的是其重定向的路径, 客户可以观察到地址的变化的。

重定向行为是浏览器至少两次的访问请求的

重定向,其实是两次request。第一次,客户端request A,服务器响应, 并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

posted @ 2022-04-01 19:47  萝卜不会抛异常  阅读(69)  评论(0编辑  收藏  举报