在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响应正文 ---- > 浏览器处理....