转发是服务器行为,重定向是客户端行为。
转发(Forward) 是通过 RequestDispatcher 对象的 forward(HttpServletRequest request,HttpServletResponse response)方法实现的,而 RequestDispatcher 可以通过 HttpServletRequest 的 getRequestDispatcher() 方法获得。例如下面的代码就是跳转到success.jsp 页面。
request.getRequestDispatcher("success.jsp").forward(request, response);
重定向(Redirect) 是通过服务器返回状态码(301、302)来实现的。客户端发起请求后,服务器会返回一个状态码,服务器一般通过 HttpServletResponse 的 setStatus(int status) 方法设置状态码。当服务器返回301或者302,则浏览器会到新的网址重新请求新的资源。
- 从地址栏显示来说
forward 是服务器请求资源,服务器直接访问目标地址的 URL,把目标站点响应的内容读取过来,然后把这些内容再发给浏览器,而浏览器不需要关注这些内容是从哪里来的,,所以它的地址栏不会发生变化。redirect 是服务端根据逻辑,响应一个状态码,告诉浏览器重新去请求某一地址,所以地址栏显示的是新的 URL;
- 从数据共享来说
forward:原页面和目标页面可以共享 request 里面的数据;
redirect:不同页面之间不能共享数据;
- 从运用地方来说
forward:一般用于用户登陆时,根据角色转发到相应的模块;
redirect:一般用于用户注销时,返回到重新登录的那个页面;
- 从效率来说
forward:高
redirect:低