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

[面试原题]java

简述java中redirect和forward的区别。面试

[正确答案]浏览器

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

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

[面试技术点]url

JavaEE中会话的概念知识。spa

[小博老师解读]code

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

图 1-1 BWF01Servlet映射的URL是BWF01get

图 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,可是这个转交动做是在服务器完成的,客户端全然不知。

相关文章
相关标签/搜索