本文只是简单描述转发和重定向的区别,不太涉及原理。
1.请求转发和重定向
转发和重定向是数据发生资源跳转的方式。通常,转发发生在服务器内部,重定向发生在不同服务器之间。
请求转发
发生在服务器内部的资源跳转方式
特点:
- 浏览器的地址不发生变化
- 只能转发到当前服务器的内部资源
- 一次请求,可以在转发的资源之间使用request共享数据
通常的实现方式如下:
req.getRequestDispatcher("/路径").forward(req,resp);
如果需要传输数据可以使用以下方法:
req.setAttribute("",""); //向request里面,设置键值对。
req.getAttribute(""); //获取request里面的值。
req.removeAttribute(""); //移除request里面的值。
重定向
资源跳转方式,可以重定向到非内部服务器。
从图中可以看出,重定向是资源A响应结果给浏览器,然后浏览器再次向资源B发起请求。
Response常用方法:
resp.setStatus(302); //设置响应状态码
resp.setHeader("Location","/路径"); //设置响应头,重定向路径
resp.setHeader("Content-Type",""); //设置响应头,接收数据类型
resp.getWriter(); //获取字符输出流
resp.getOutputStream(); //获取字节输出流
重定向代码如下:
resp.setStatus(302); //设置响应状态码
resp.setHeader("Location","/"); //重定向路径
//简化写法
resp.sendRedirect("/路径");
特点:
- 浏览器的路径发生变化
- 可以重定向到任意位置的资源(服务器内部,外部均可)
- 两次请求,因此无法在多个资源使用request共享数据。
2.总结
Request :
Response :
补充路径问题:
在请求转发和重定向写资源路径的时候,可能会有一点不一样。请求转发的资源路径是在服务器内部,所以可以不用写虚拟目录(虚拟目录默认是项目名)。重定向有可能发生在不同服务器之间,因此需要加上虚拟目录。
浏览器使用(发出):需要加虚拟目录
服务端使用(发出):不需要加虚拟目录
举例子如下:
<a href = '路径' > //需要
<form action = '路径' > //需要
req.getRequestDispatcher("/").forward(req,resp); //不需要
resp.sendRedirect("/路径"); //需要