重定向:
客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。
例子一枚:在index.jsp里实现一个链接请求,链接到TargetServlet.java,这时web服务器端使用HttpServletResponse的sendRedirect()方法返回一个 302 HTTP状态码和一个指定地址,这里是target.jsp,简单的传递一条信息。
开始界面:没有进行请求
点击链接后:返回msg信息,可在网络中看到有状态码302和200,共有三个请求。
再仔细观察,发现地址栏发生了改变,原因如下:客户端浏览器根据web服务器返回的302状态码再次向web服务器发出请求(这个过程是自动的,不需要人工参与),这是按照新地址进行的一个新请求,所以地址栏会变成新地址。此时web服务器会将新地址的内容返回到浏览器页面。可以看到"目标信息"。
重定向:不难理解,在客户端浏览器向web服务器请求的过程中,共执行了两次请求和两次响应,且地址栏显示的是第二次访问的新地址。
请求转发:
请求转发指客户端浏览器向web服务器端发送请求,服务器端收到请求后会进行内部操作,将这一请求转发到另一资源,web服务器对该资源进行处理后反馈给客户端。
开始界面:没有请求
点击链接后服务器会链接到TestServlert.java,运行这里的资源(例子中运行(新地址)target.jsp),并将结果反馈到浏览器页面。这里地址栏并不会变为资源里面的新地址,全程只有一次请求和一次响应。
请求转发:请求转发客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。采用请求转发的方式,客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
重定向与请求转发的区别:
1、重定向:当客户端向服务器发送一个请求,请求地址发生了变化(),服务器向客户端返回了一个继续处理的新地址,此时客户端自动(不需要人工参与)访问服务器的新地址,服务器将新地址的内容返回给客户端。采用重定向的方式进行处理,客户端和服务器端共执行了两次请求和两次响应,且浏览器地址栏显示的是第二次访问的新地址。
请求转发:客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。采用请求转发的方式,客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
2、请求转发方式处理页面跳转,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源,而重定向没有这个限制。
3、重定向无法在新的页面获取request.setAttribute中保存的数据,请求转发可以。
4、Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取。