web开发之图解请求转发与重定向及其使用注意事项


         在web开发中,经常会遇到一些需要web资源进行重定向和请求转发的需求。并且重定向与请求转发也是比较经典的web开发问题,有时候使用不当会造成很多问题。

通过一些步骤来了解更多的请求转发和重定向知识:

       (1)图解请求转发和重定向

       (2)请求转发和重定向的区别

       (3)请求转发和重定向使用注意事项

      (注:服务器是基于tomcat)

              ******************************************************************************************************


1.图解请求转发和重定向

(1.) 请求转发

     以下是基于tomcat中的web开发中请求转发流程:

    

   客户端浏览器发送request请求到first,tomcat服务器内部通过requestDispatcher进行请求转发,将请求由服务器发送到内部另外一个资源处理器进行处理,将处理后的资源封装到response返回浏览器。(转发到的资源必须是站内资源)

request.getRequestDispatcher("/second").forward(request,response);

========================================================================== 

(2.0 )重定向

      以下是基于tomcat中的web开发中重定向流程:

       

       第一次客户端request请求发送到tomcat服务器,在服务器处理中,firstservlet将response的响应状态码设置为302,并且将响应头location设置为second。当response发送回浏览器时,浏览器读取response响应头得知状态码为302,又二次发送请求到location指定的URL。

// 1.设置状态码为302
response.setStatus(302);
// 2.设置响应头location
response.setHeader("location", "http://localhost/demo/second");
response.setHeader("location", "/demo/second");
// 在开发中
response.sendRedirect("/demo/second"); 

**************************************************************

2.请求转发和重定向的区别

(1)请求转发是服务器内部的跳转,地址栏不会发生改变
     重定向地址栏会发生改变。

(2)请求转发,只是包含一次请求,一次响应。
     重定向有两次请求,两次响应。

(3)请求转发存在request域,可以通过request域共享数据。
    重定向不存在request域(两次请求对应两个不同的request对象)

(4)请求转发只能在服务器内部跳转,简单的说,就是只能访问本站内资源。
    重定向可以访问站外资源、也可以访问站内资源。

(5)请求转发是由request对象发起的:request.getRequestDisipatcher("...").forward(request,response);
     重定向是由response对象发起的:response.sendRedirect("...");

(6)请求转发与重定向的访问路径参数写法不同:
     重定向要跳转的路径是从浏览器再次发送的,是浏览器路径,这时候写法为:  /web工程名/资源
     请求转发是服务器内部跳转,这时它与浏览器无关,写法: /资源



3. 请求转发和重定向使用注意事项

(1)请求转发与重定向不可以一起使用,习惯在两者跳转语句后添加上return。表示已经结束。

(2)请求转发和重定向他们在执行时候,会clear 清空response缓冲区。例如:

response.getWriter().write("hello"); //向response缓存区中写入数据

request.getRequestDispatcher("..").forward(request,resposne);
return;

或者是
response.sendRedirect("...");   //请求转发 或者 重定向 。两者不可同时使用。
return;
那么在访问该servlet资源时候,不会在页面中输出hello.

**关于response缓冲区:缓存区数据流的处理过程(大致过程):
response.getWrite().write/getOuputStream.write -----> response缓存区 ----->servlet等资源处理完成 -----> 服务器将缓存区数据封装到response响应正文 ---- > 浏览器处理....


        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值