小博老师解析经典Java面试题-redirect和forward的区别

来源:互联网 发布:冢原卜传 知乎 编辑:程序博客网 时间:2024/05/29 17:06

[面试原题]

简述java中redirect和forward的区别。

[正确答案]

redirect是url重定向,让客户端重新发送一次请求到另一个url。因此整个过程客户端向服务器发送了两次请求,并且客户端浏览器地址栏中显示新的url。

forward是服务器转发,客户端只向服务器发送一次请求,而服务器在内部做了转交处理,客户端并不知情。因此客户端浏览器地址栏中显示的是前一次的url。

[面试技术点]

JavaEE中会话的概念知识。

[小博老师解读]

首先我们在项目中新建两个Servlet,BWF01Servlet映射BWF01,BWF02Servlet映射BWF02。核心代码如下:



图 1-1 BWF01Servlet映射的URL是BWF01


图 1-2 BWF02Servlet映射的URL是BWF02


现在我们通过浏览器来访问BWF01,并且希望自动跳转到BWF02。我们先使用redirect(跳转)的方式来实现,我们在BWF01Servlet最后增加一条指令:response.sendRedirect("BWF02");

浏览器访问BWF01后,看到的结果如下:




我们会看到,页面显示的内容是BWF02Servlet中的内容,浏览器地址栏中访问的也是BWF02。其实在这个过程中,客户端向浏览器发送了两次请求,第一次请求:客户端向服务器请求BWF01,BWF01Servlet执行后,response.sendRedirect("BWF02");响应给客户端,让客户端URL重定向到BWF02,此时客户端发送第二次请求到BWF02。



我们再使用forward(服务器转定向)的方式来实现,我们在BWF01Servlet中,把刚才新增的response.sendRedirect("BWF02");修改成:request.getRequestDispatcher("BWF02").forward(request,response);浏览器访问BWF01后,看到的结果如下:

我们发现,显示的结果依然是BWF02Servlet中的内容,区别在于浏览器地址栏中请求的是BWF02而不是BWF01,这是因为在这个过程中,客户端只向服务器发送了一次请求,请求的URL是BWF01,然后BWF01Servlet运行后request.getRequestDispatcher("BWF02").forward(request,response);请求对象Request通过拦截配置信息找到了BWF02这个URL Mapping对应的Servlet(BWF02Servlet),将当前请求的处理任务转交(forward)给了BWF02Servlet,并且将当前请求的Request和Response对象作为传输传给了BWF02Servlet。因此处理当前这次请求的真正Servlet是BWF02Servlet,但是这个转交动作是在服务器完成的,客户端全然不知。


0 0
原创粉丝点击