请求转发(Forward)

请求转发(Forward):一种在服务器内部的资源跳转方式

简单来说,当客户浏览器发送http请求到web服务器中,web服务器接受请求后调用内部servlet方法完成请求处理和转发资源给同一个web容器下的另一资源做处理,最后将目标资源response给客户。

工作原理及特点
在这里插入图片描述
比如图中web容器(Tomcat)有两个资源(A和B),若浏览器请求资源A的时候,资源A处理了一部分,然后跳转到资源B,让资源B接着处理,资源B处理完成后做出响应到服务器。资源A跳转到资源B的这个过程就叫转发。

实现代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
	//获取请求转发器对象,调用forward()方法,请求转发
	RequestDispatcher requestDispatcher = request.getRequestDispatcher("跳转资源的路径").forward(requset,response);
}

1. 请求转发资源间共享数据

图中资源A处理了一部分数据后把其他数据转交给资源B处理,所以在这过程中资源之间数据是共享的。

void setAttribute(String name,Object o)//存储数据到request域中
Object getAttribute(String name)//根据key,获取值
void removeAttribute(String name)//根据key,删除该键值对

2. 浏览器地址栏路径不发生变化,只能转发到当前服务器的内部资源,浏览器只做了一次请求

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

Response完成重定向(Redirect)

重定向(Redirect):一种资源跳转的方式

一般用来解决登录进入主页、跨域访问、系统维护等等都使用重定向技术,比如当系统进行维护时,用户若发起请求,系统将会告诉浏览器重定向访问指定的url。

简单来说,当浏览器发起请求给资源A时,资源A发现浏览器发起的请求自身处理不了,但是知道资源B可以处理,这时候资源A就会告诉浏览器说这次请求处理不了,请找资源B处理并且告诉资源B的访问路径,浏览器会自动去请求资源B。

工作原理及特点
在这里插入图片描述
客户浏览器发送http请求后,web服务器中资源A接受请求后无法处理,资源A将会发送302状态码响应及对应新的location(资源B)给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址。

实现代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
	//旧方法
	//response.setStatus(302);
	//response.setHeader("location","资源B的路径");
	
	//其中资源B的路径需要添加虚拟目录
	response.sendRedirect("资源B的路径");
}

1. 浏览器地址栏路径发生变化

2. 可以重定向到任意位置的资源(服务器内部、外部均可)

3. 浏览器发起两次请求,不能在多个资源使用request共享资源

总结

转发和重定向是两种不同的请求转发方式,转发是服务器行为,重定向是客户端行为。
请求转发过程中,数据在同一个web服务器中得到共享,因为浏览器只做了一次访问请求,为同一个request域;而重定向中,浏览器做了两次请求,请求并不是同一个request域。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐