转发和重定向是经常使用的两种页面跳转方法,但他们在原理实现和应用场景上都有很多的不同,总结如下:
1.语法不同
//转发
req.getRequestDispatcher("index.jsp").forward(req,resp);
//重定向
resp.sendRedirect("index.jsp");
其中req
代表HttpServletRequest
类即浏览器的请求,resp
代表HttpServletResponse
类即服务器的响应。
2.原理不同
2.1转发的原理图解
浏览器向Servlet01页面发送一个请求,若在Servlet01中定义了转发的方法,会在服务器内部完成跳转,方法名为
req.getRequestDispatcher("index.jsp").forward(req,resp);
这一过程对于浏览器和用户而言是不可见的,因此地址栏不会有任何变化
2.2重定向的原理图解
浏览器向Servlet01页面发送一个请求,若在Servlet01中定义了重定向的方法,会由服务器先向浏览器返回带有目的页面URL的参数,并附加状态码302,让浏览器知道现在要完成跳转动作。
接收到跳转指令后,浏览器向目的URL重新发送请求,若请求成功服务器返回状态码200,完成重定向跳转动作。
这一过程需要浏览器的参与,地址栏会有相应的变化(变化为跳转后的URL)。
3.跳转的范围不同
由于转发是在服务器内部进行的,跳转的范围被限制在当前服务器的当前应用。
而重定向由浏览器发送URL请求完成,范围是所有服务器的所有应用
4.“/”标识符代表的含义不同
由于转发是在服务器内部进行的,在指定转发的URL中,“/”代表当前应用
而重定向的“/”则代表当前服务器。
5.刷新后是否会重新提交表单/参数
对于转发而言,通过Request对象携带的参数会继续存在,若刷新当前页面,则会导致已经提交的表单再次提交,对于主流浏览器而言,此时会弹出是否重复提交表单的确认弹窗。
而重定向不会携带这些数据,刷新时安全的。
6.效率不同
对于转发而言,过程发生在服务器内部,不经过重定向的二次网络过程和请求,因此效率更高
7.携带参数的方式不同
对于转发而言,携带参数跳转的方式是通过方法request.setParameter
来绑定。
而对于重定向,一种可行的办法是用?key=value&key2=value2
的方式在URL后面增加显性参数。
如何选择?
建议一:
对于竭力避免表单重复提交的场景下选择重定向方式
建议二:
对于效率要求更高的场景选择服务器内转发
建议三:
若携带较多参数则选择服务器内转发