了解转发和重定向-SpringMvc
1.为什么会思考转发和重定向?
平常我们在项目中对于用户登录模块,用户登录成功后一般后台是通过重定向来到一个新的页面。那么为什么这里需要重定向?以及什么时候使用转发?这里做一个记录总结
1.1 为什么用户登录成功后需要进行重定向?
重定向场景: 因为重定向会修改浏览器地址, 所以 form 提交应该使用重定向, 以免用户刷新页面导致form重复提交.
1.2 转发的场景
场景:需要携带请求域request的相关参数 在后台获取使用的时候
2.转发和重定向的定义
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,用户观察不到地址的变化。也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应码,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
结合生活场景:
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
原文链接:https://blog.csdn.net/meiyalei/java/article/details/2129120 感谢原作者精彩的案例分析。
3.两者的区别?
区别 | 转发 forword | 重定向 redirect |
---|---|---|
地址栏 | 不发生变化 | 发生变化 |
跳转 | 服务器跳转1次 | 浏览器和服务器至少2此跳转 |
请求域中数据(传输中的信息) | 不会丢失 | 会丢失 |
访问外部资源 | 不可以访问自己web应用以外的资源 | 可以访问自己web应用以外的资源 |
4.代码实现调用
在servlet中调用转发、重定向的语句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
<jsp:forward page="apage.jsp" />
当然也可以在jsp页面中实现重定向:
<%response.sendRedirect("new.jsp");//重定向到new.jsp%>