参考博客地址:
https://www.cnblogs.com/lexiaofei/p/7044429.html?utm_source=itdadao&utm_medium=referral
参考博客地址:
https://blog.csdn.net/senmon2004/article/details/654049
下面是关于forward和redirect方式的区别(SpringMVC中):
1 forward
forward方式相当于request.getRequestDispatcher().forward(request,response)。
外部特征:浏览器地址显示的路径是转发前的路径。
工作方式是这样:
forward 发生在服务器内部,在前一个控制器处理完毕后,直接进入下一个控制器处理, 并将最后的response发给浏览器.
这种方式的特点:
A.转发前后是同一个request,后一个控制器可共享前一个控制器的参数与属性;
B.因为是同一个request,拦截器只会拦截前一个url,如果前一个url在映射时未配置到拦截器拦截,则拦截后一个
url,即只拦截一次;
C.最后返回到浏览器后,因为地址栏显示的是转发前的url,所以刷新页面时会依次执行前后两个控制器.
2 redirect
redirect方式相当于”response.sendRedirect()”,就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址
外部特征:浏览器地址显示的路径是转发后的路径。
工作方式是这样的:
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址(服务器端会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器),然后服务器发新的response给浏览器. 这时页面收到的request对象是重新从浏览器发来的,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取
这种方式的特点:
A.在转发前后有两个不同的request对象,转发前后的两个控制器在request上的参数(request.getParameter())
和 request属性(request.getAttribute())不能共享;
B.如果转发前后的两个控制器都配置在spring 拦截器范围内,这样拦截器会拦截前后两个request,即会拦截两次;
C.最后返回到浏览器后,因为地址栏显示的是转发后的url,所以刷新页面时只会执行后面的url映射的控制器.
- 举例如下:
a页面-------->b页面(-->代表两种方法的一种)
3. forward和redirect的区别
forward仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
redirect则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,forward更加高效,在forward可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
4. 小提示
- 如果逻辑视图名为 hello,框架通过 forward 的方式转发到了 /WEB-INF/jsp/hello.jsp。
- 如果逻辑视图名是 /hello,框架还是转发到了 /WEB-INF/jsp/hello.jsp,即 /WEB-INF/jsp//hello.jsp 等同于 /WEB-INF/jsp/hello.jsp。