重定向
1,客户端浏览器向Web应用服务器端发送一个请求,Web服务器端将调用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;
2,客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户。
请求转发
请求转发指客户端浏览器向Web服务器端发送请求,服务器端收到请求后进行相应处理后再将该请求转发到另外的资源,服务器端对该资源进行处理后反馈给客户端
区别
重定向:客户端向服务器发送一个请求后,请求地址将发生了变化,客户端接收到来自服务器的新地址后将自动访问该新地址,也即重定向中客户端和服务器将处理两次请求,请求的地址会被改变一次。
请求转发:客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
1,重定向无法在新的页面获取request.setAttribute中保存的数据,而请求转发可以;
2,请求转发在处理页面跳转时,跳转的新地址必须是本Web应用系统的资源,不可以是其他Web应用的资源。而重定向可以;
3,Web项目中WEB-INF文件夹非常安全,该目录内的资源只能通过请求转发获取,而重定向的方式无法获取;
实例
TargetServlet中代码如下:
public class TargetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name","Tom");
//重定向可以访问外网
response.sendRedirect("http://www.baidu.com");
//请求转发不可访问外网
request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
//重定向无法获取request.setAttribute("name","Tom");里的数据
response.sendRedirect("http://www.baidu.com");
//请求转发可以获取request.setAttribute("name","Tom");中的数据
request.getRequestDispatcher("/WEB-INF/target.jsp").forward(request, response);
}
要跳转到的/WEB-INF/target.jsp页面代码如下: